第一篇:MySQL中文模糊搜索解决方案
在 MySQL下,在进行中文模糊检索时,经常会返回一些与之不相关的记录,如查找 “%a%” 时,返回的可能有中文字符,却没有a字符存在。本人以前也曾遇到过类似问题,经详细阅读MySQL的Manual,发现可以有一种方法很方便的解决并得到满意的结果。例子:
希望通过“标题”对新闻库进行检索,关键字可能包含是中英文,如下SQL语句:QUOTE:
select id,title,name from achech_com.news where title like '%a%'
返回的结果,某些title字段确定带了“a”关键字,而有些则只有中文,但也随之返回在检索结果中。
解决方法,使用 BINARY 属性进行检索,如:
QUOTE:
select id,title,name from achech_com.news where binary title like '%a%'
返回的结果较之前正确,但英文字母区分大小写,故有时在检索如“Achech”及“achech”的结果是不一样的。知道了使用 BINARY 属性可以解决前面这个问题,再看看 MySQL 支持的UCASE 及 CONCAT 函数,其中 UCASE 是将英文全部转成大写,而CONCAT函数的作用是对字符进行连接,以下是我们完全解决后的SQL 语句:
QUOTE:
select id,title,name from achech_com.news
where binary ucase(title)like concat('%',ucase('a'),'%')
检索的步骤是先将属性指定为 BINARY,以精确检索结果,而被 like 的 title内容存在大小写字母的可能,故先使用 ucase 函数将字段内容全部转换成大写字母,然后再进行 like 操作,而 like 的操作使用模糊方法,使用 concat的好处是传进来的可以是直接的关键字,不需要带“%”万用符,将“'a'”直接换成你的变量,在任何语言下都万事无忧了。当然你也可以这么写:
QUOTE:
select id,title,name from achech_com.news where binary ucase(title)like ucase('%a%')
检索的结果还算满意吧,不过速度可能会因此而慢N毫秒
第二篇:PHP MySql乱码解决方案
PHP乱码?Mysql乱码?怎么解决?
PHP乱码或者mysql乱码,多半是因为没有统一编码,要解决PHP/mysql乱码,只要做到三码合一即可.所谓三码,是指文件编码,页面编码声明和数据库字符集,要使用相同的编码,如全部为utf-8.怎么做到三码合一?下面以utf-8为例,说明如何统一编码.1.网页文件编码保存为utf-8无BOM
记事本,保存文件的时候选择“编码”为utf-8
editPlus,保存时选择“encoding”为utf-8
UEStudio保存时选择“格式”为utf-8无BOM
2.PHP页面内部使用header('Content-type : text/html;Charset=UTF-8');声明页面编码为utf-8
在html头部写入来声明页面编码为utf-8
3.PHP页面中连接数据库服务器后执行sql查询前使用以下代码先将字符集设置为utf-8 mysql_query('SET NAMES utf8');[或mysqli,具体代码这里不再写了]
4.创建数据表的时候将默认编码设置为utf8,将字符校对(callate)设置为utf8_general_ci CREATE TABLE IF NOT EXISTS `name`(....代码....)ENGINE InnoDB DEFAULT CHARSET utf8 COLLATE utf8_general_ci
做到这四点,相信你的网页和数据库不会再乱码.
第三篇:搜索关联词解决方案
想找到一个好的同义词解决方案,在javaeye搜此类信息也求不到,后来发了个提问贴也只有浏览数而无回复,不知道这是什么原因,搜索关联词解决方案。
所谓近义词、关联词检索不外乎以下三种形式:
1.类似google suggest,用户输入关键字后自动提示功能。
2.假如“奥运会”的关联词是“北京”,用户输入“奥运会”搜索时,将“奥运会”的搜索结果以及“北京”的搜索结果都搜出来。
3.用户输入“奥运会”搜索,只显示“奥运会”的结果,它的关联词在结果集的底端用“相关搜索”的形式提示给用户。
这三种方式中看似2和3是类似的,其实还是有些很大区别的,我个人认为在实际的应用中,第3种方式是最多见的。
先说说第1种方式
google suggest的在网上可以搜到完整的解决方案,跟我此前想的一样。
建一个用来存储关键字的表
例如:
Sql代码
create tableKEYS(ITEM_ID varcha2(50)not null,SEARCH_KEY varchar2(100),);SEARCH_KEY里存储一些检索的关键字,如“奥运”,“奥运会”,“北京奥运会”等.当用户在文本框敲入时,使用AJAX将当前文本框的内容发到Action,进行下面类似的操作
Java代码
String key = request.getparameter(“inputValue”);String sql = “select * from KEYS as k where k.SEARCH_KEY like '%key%'”;这个办法也就是把当前文本框中的字放到数据库中做模糊查询,比如用户输入“奥”这个字,会从搜出所有包含“奥”字的词,然后将这些词包装好,发回至页面,页面上用JS画出下拉框,将这些包含“奥”字的词填入就可以了。
google做的是右边匹配,即是用的 like 'key%' ,输入“奥”字,会出现所有以“奥”字开头的词的提示。
大家应该注意到google suggest的提示词的最后面都写有“约XXXXX条记录”,我现在唯一能想到的解决方案是,当我们在Action中拿到匹配的词之后,将匹配的词搜索一次即可得出具体记录的条数,其实这样也不耗多少资源。
第2种方式
将关键词和关键词所联的词的结果都搜出来
我个人认为这个功能在实际的应用中只需用到其5%就可以了,因为在用户体验方面考虑,我们必须保障搜索结果的质量。关键词的近义词可以在结果页的底端提示给用户,也就是我上边说到的第3种方式。
我所说的只需用到5%的意思是只需为少数的、必须转义的词实现这样的功能
比如搜索“China”,那么“中国”这个词的结果肯定得出现在结果集里,还有比如搜索“08”,那么“2008”的结果也得出现在结果集里,这些都是一些特定情况,其它的词没必要做成这样,只需做提示即可。
现在中文检索一般都是基于词库的检索,实现第2种方式这个功能必须将之前的词库以及分词算法进行修改。
一般的方法是在词库中把同义词写成一行,如将“中国 China”写在同一行,然后修改Token算法(这个大家可以去研究一下,我现在使用的Analyzer包是公司商业上的伙伴提供的测试包,这个测试包已经可以满足很大一部分需求了,我还不知道能不能共享)
其实原理是在索引时将原词和原词的近义词一起索引
具体给大家个例子
有这样一句话----“中国是世界上人口最多的国家”
如果没有为其做同义词,大家可能会索引成这样
如果做了同义词,会索引成即是说在索引时就已经将“中国”这个词存成了,搜索时无论搜“中国”或是“China”都可以搜到这句话,规划方案《搜索关联词解决方案》。
其实这个功能相当大一部分是依赖第三方的jar包,说来说去也没多大意思,并且大多数情况下我们需要的并不同这种功能,而是更人性化的查询提示的功能,也就是第3种方式。
第3种方式
这种方式是我在原有的系统上改进完成的原有的系统是 compass + paoding + lucene
由于我不太熟compass的搜索,所以我还是采用的lucene搜索。相信大家对这种搭配的全文检索已经非常熟悉了,paoding的词库是可以自己配置的。
那么怎样在原有的基础实现关键词提示功能呢???
我的做法是这样的,我按照paoding词库的特点新建了一个mydictionary.dic文件放在classpath下,里面的内容大致如下。
第1行:奥运会北京2008第29届奥运会
第2行:中国 China 中华人民共和国 中国电信 中国人民银行
........然后在服务器启动时,将mydictionary.dic这个文件中的文字一行行读入,分别做索引
Java代码
InputStream fi = this.getClass().getClassLoader().getResourceAsStream(“mydictionary.dic”);File indexDir = new File(“d:tong”);Analyzer luceneAnalyzer = new StandardAnalyzer();IndexWriter indexWriter = new IndexWriter(indexDir, luceneAnalyzer,true);BufferedReader reader = new BufferedReader(new InputStreamReader(fi, “UTF-8”));String line = new String();while((line = reader.readLine())!= null){Document document = new Document();Field FieldName = new Field(“line”, line,Field.Store.YES, Field.Index.TOKENIZED);document.add(FieldName);indexWriter.addDocument(document);}indexWriter.optimize();indexWriter.close();reader.close();
在搜索时,对用户输入的关键字正常搜索出结果后,对关键字进行第二次搜索,搜的是同义词的索引,得到的结果按空格分开,即可得到所有同义词,然后将同义词发送至页面即可。
Java代码
public List getTongYi(String searchword)throws Exception{List list = new ArrayList();Hits hits = null;String queryString = searchword;Query query = null;String result = “";IndexSearcher searcher = new IndexSearcher(”d:tong“);Analyzer analyzer = new StandardAnalyzer();Queryparser qp = new Queryparser(”line“, analyzer);query = qp.parse(queryString);if(searcher!= null){hits = searcher.search(query);for(int i=0;i 远程客户端连接MysqL数据库太慢解决方案 远程客户端连接MysqL数据库太慢解决方案 局域网客户端访问mysql 连接慢问题解决。 cd /etc/mysql vi my.conf [mysqld] skip-name-resolve 此选项禁用了DNS解析,连接速度会快很多。 不过,这样的话就不能在MySQL的授权表中使用 主机名了而只能用ip格式。 问题1: 在使用tomcat服务器时,如在跳转路径中传递中文参数会出现乱码现向!如:以 和第四篇:远程客户端连接MysqL数据库太慢解决方案
第五篇:中文参数乱码问题解决方案
解决:在tomcat/conf/servlet.Xml中 加入一段代码:
debug=“0” connectionTimeout=“20000” disableUploadTimeout=“true” URIEncoding=“true”/> 问题2: 如果uri中转递的是参数要发送到jsp页面,则必须在接受代码的jsp页面里面还要加入代码: <% request.setCharacterEncoding(“gb2312”);%> 问题3: 在jsp页面里的代码修正: <%@ page language=“java” import=“java.util.*” pageEncoding=“gb2312”%> <%@ page contentType=“gb2312”%>