中文模糊搜索 - 陈春羽

什么是模糊搜索?为什么要使用模糊搜索?相信大家都知道这些,我就不讲了。今天只讲怎么使用模糊搜索。

一 LIKE。大名鼎鼎的like字句,使用方便,兼容性好,易维护,但效率奇低。大家都会用,不多介绍。

二 MYSQL 原生支持的全文索引(FULLTEXT index)。
实现方式:首先给目标字段添加索引,索引的类型是FULLTEXT,然后查询的时候,在sql语句的where条件后面使用against()去指定关键字就好了。
而网上很多文章对这个理解却有很多误区,认为FULLTEXT不支持中文,或者Linux下全文索引不支持中文,然后说要把中文转为拼音就好了。事实上不是这样的,重点是在于分词,因为中文没有自然分词,不像英文每个单词都有空格隔开,而转为拼音之后,每个字对应的拼音之间也像单词一样空格隔开,所以才有了“FULLTEXT不支持中文,要把中文转为拼音”这一说法。
其实,转拼音也行、按照分词规则把一个个词组用空格隔开也好、甚至简单粗暴的每个字空格隔开都可以,然后把这些用空格隔开的文本存入都数据库的一个特定字段里面,也就是数据库里面要一份信息要存两个字段,一段原始文本/一段分词之后的文本。注意,FULLTEXT 索引要设置在分词之后的那个字段上面。
优点:与使用like字句相比,更加高效,且MYSQL 原生支持。
缺点:要额外维护一个字段,而且需要自行分词。使用复杂,有多复杂?请见下文(FULLTEXT全文索引的几个关键点)

三 使用第三方组件,(Coreseek)sphinx、迅搜……
实现方式:把数据中需要搜索的字段连同Id,一起导入到这些第三方组件中去,搜索的时候,调用这些第三方组件提供的api去搜索,得到返回的Id,再根据Id去数据库查询。
优点:比上面两种方案都要高效,且不需要自行分词。
缺点:需要额外维护这个第三方组件,并且每次更新数据库都要同时更新它。

而我选择了方案三,至于维护与同步,都交给了定时任务去做了。

-- FULLTEXT全文索引的几个关键点
1. 表的存储引擎需要是MyISAM,听说MYSQL5.6也支持全文索引了;
2. 字段类型:char、varchar和text;
3. MySQL全文索引查询关键词最小长度限制;
=> ft_min_word_len,默认是4,建议改为1,不然against()对应的关键字就只能是4个以上的字符,查不了单个字符,也查不了单个汉字.
=> my.ini配置文件中添加
[mysqld]
ft_min_word_len = 1
=> 设置 ft_min_word_len 之后,要重启MySQL服务,然后执行 SHOW VARIABLES 查看 ft_min_word_len设置成功没有;
=> 重新设置配置后,已经设置的索引需要重新设置生成索引,不然有可能报错,
我在update某些记录的时候就报错了: Incorrect key file for table ‘./webm/temp.MYI‘;try to repair it.
后来, 我执行了 mysql> repair table 表名; 就好了;
5. match(索引名),match()的参数是索引名,不是字段名;
=> MATCH(title, content)里的参数必须和FULLTEXT(title, content)里的参数一模一样。
6. match(singername,songname),可以同时在多个索引名里面查找关键字;
7. 如果一个关键词在50%的数据出现,那么这个词会被当做无效词,可以使用against(‘关键字‘IN BOOLEAN MODE)绕过无效设定;
8. 如果搜索多个词,请用空格或者逗号隔开,如下
=> SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST (‘a x‘);
=> SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST (‘a,x‘);
=> AGAINST(‘关键字1 关键字2‘),使用逗号或空格隔开多个关键字,使用的是or规则.
9. 每次更新表都会重构索引,索引使用了全文索引会拖慢insert和update;
10. 搜索语法规则;
=> + 一定要有(不含有该关键词的数据条均被忽略)。
=> - 不可以有(排除指定关键词,含有该关键词的均被忽略)。
=> " " 用双引号将一段句子包起来表示要完全相符,不可拆字。

时间: 2024-11-08 12:41:13

中文模糊搜索 - 陈春羽的相关文章

办公室网络二三事 -- 陈春羽

开始的时候,我们办公室拉了两条家庭百兆宽带,两条宽带分别接到路由器的wan1/wan2口上,我们愉快的工作愉快的上网. 后来,再拉了一条十兆企业专线,接到了路由器的wan3口上面,配了一些静态路由,希望办公室访问特定网段的时候,从wan3口出去,走企业专线.我们的故事也是从这里讲起. part1,一些小伙伴反映网络断断续续. 然后,我们就开始各种猜测,各种折腾:ipconfig.ping.arp.抓包…… 然后再找到网络异常的小伙伴机房那边的端口,然后连到我们自己的电脑上面去(那时候我的电脑上网

全解┃OpenStack Newton发布,23家中国企业上榜(转载)

(转载自Openstack中文社区) 陈, 翔 2016-10-8 | 暂无评论 美国奥斯汀时间10月6日(北京时间6日24点),OpenStack Newton版本正式发布,在可扩展性.可靠性和用户体验方面均有显著提升(本文第四部分将具体介绍). 作为最火爆的开源云计算技术,OpenStack已经成为仅次于Linux的全球第二大活跃的开源社区,有超过585家企业.近4万人通过各种方式支持着这个超过2000万行代码的开源项目. 经过6年的打磨,Newton已经是第14个OpenStack版本,最

Pyecharts : plot Graph, Line, Liquid, Parallel

报错:ascii' codec can't decode byte 0xe5 in position 2877: ordinal not in range... 主要错误是上面最后一行的Unicode解码问题,网上搜索说是读取文件时使用的编码默认时ascii而不是utf8,导致的错误: 在代码中加上如下几句即可. import sys reload(sys) sys.setdefaultencoding('utf8')  2017-07-27 作者陈键冬 Python中文社区 ?陈键冬,Pyth

Oracle系列——开发中奇葩问题你遇到几个(一)

前言:在使用oracle数据进行开发的时候有没有经常出现一些很奇怪.很纳闷.很无厘头的问题呢.下面是本人使用oracle一段时间遇到的问题小节,在此做个记录,方便以后再遇到类似的问题能快速解决.如果你是数据库大虾,此文可以略过:如果你是数据库小菜或者刚从sql server转到使用oracle开发,这些问题可能你曾经遇到或者即将遇到,不信?走着瞧! 1.oracle插入数据中文乱码的问题: 问题描述:在plsql中不管是编辑数据,还是使用insert语句插入,所有的中文都会变成乱码. 解决方法:

<整理> linux常用命令及工具(个人向)

参考来源: https://www.cnblogs.com/lansetiankongblog/p/7851489.html https://www.osetc.com/archives/157.html http://man.linuxde.ent/ 欢迎讨论交流,如有侵权请联系本人! 大多数常用命令和工具都可以在http://man.linuxde.ent/网站中查到具体的用法,并且该网站提供了中文模糊搜索功能,也可以根据功能需要搜索命令和工具. 移动及重命名文件或文件夹 # 格式 # mv

First-blog:解决mybatis 用mysql进行模糊搜索时,查不了中文问题

如图:点击小字 按搜索时,出现乱码搜索不了 解决办法:出现乱码问题,一般无非两种 1.是数据库问题 2.是服务器问题 我在MySQL命令行搜索时,中文可以实现,说明时服务器问题 通过修改 tomcat 下 cof 文件夹里的 service文件,在 <connecter 尾端添加 URIEncoding="UTF-8"/> 问题解决 原文地址:https://www.cnblogs.com/coldfirecx/p/9830248.html

用中文对着她喊“Bingbing

有记者曾经埋怨,范冰冰是最难偷拍的女艺人,风言风语满天飞,却一次都没有被拍到过.拿了这个问题去难堪她,她很坦然,"我自己的主意,是做一个有肩膀的姑娘,不惧怕去承担." 范冰冰从来都是个敢做敢当的人.以下,是范冰冰的BH语录. ★"我这样个性的人,谁敢包养我,我不去包养别人就不错了." --------------------------------------------------------------- ★"我泱泱大国诚信为本,不像某些人拍八卦.&q

CIKM Competition数据挖掘竞赛夺冠算法陈运文

CIKM Competition数据挖掘竞赛夺冠算法陈运文 背景 CIKM Cup(或者称为CIKM Competition)是ACM CIKM举办的国际数据挖掘竞赛的名称.CIKM全称是International Conference on Information and Knowledge Management,属于信息检索和数据挖掘领域的国际著名学术会议,由ACM SIGIR分会(ACM Special Interest Group on Information Retrieval)主办.

实验二-3 Hadoop&amp;Paoding 中文词频统计

  参考教程 在Hadoop上使用庖丁解牛(较复杂,并未采用,可以之后试试) http://zhaolinjnu.blog.sohu.com/264905210.html Lucene3.3.Lucene3.4中文分词——庖丁解牛分词实例(屈:注意版本) http://www.360doc.com/content/13/0217/13/11619026_266124504.shtml 庖丁分词在hadoop上运行时的配置问题(采纳了一半,没有按照其所写配置dic属性文件) http://f.da