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

一 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. 搜索语法规则;
=> + 一定要有(不含有该关键词的数据条均被忽略)。
=> - 不可以有(排除指定关键词,含有该关键词的均被忽略)。
=> " " 用双引号将一段句子包起来表示要完全相符,不可拆字。

中文模糊搜索 - chunyu的更多相关文章

  1. ios中文模糊搜索兼容问题

    $(function(){ var cpLock = true; $("input[name='name']").off().on({ compositionstart: func ...

  2. EasyUI combobox

    高度自适应 data-options="required:true,editable:false,panelHeight:'auto',panelMaxHeight:170" 加上 ...

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

    前言:在使用oracle数据进行开发的时候有没有经常出现一些很奇怪.很纳闷.很无厘头的问题呢.下面是本人使用oracle一段时间遇到的问题小节,在此做个记录,方便以后再遇到类似的问题能快速解决.如果你 ...

  4. mysql百万级全文索引及match快速查找

    建立全文索引的表的存储引擎类型必须为MyISAM 问题是match   against对中文模糊搜索支持不是太好 新建一个utf8 MyISAM类型的表并建立一个全文索引  : CREATE TABL ...

  5. 「 神器 」快速启动应用Wox

    每天进步一丢丢,连接梦与想 合理的的要求是锻炼 不合理的要求是磨练 过分的要求是锤炼 今天分享一个会让你爱不释手的神器,Wox Wox 是一款国产开源免费的软件快捷启动工具,它可以快速搜索并打开你电脑 ...

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

    如图:点击小字 按搜索时,出现乱码搜索不了 解决办法:出现乱码问题,一般无非两种 1.是数据库问题 2.是服务器问题 我在MySQL命令行搜索时,中文可以实现,说明时服务器问题 通过修改 tomcat ...

  7. man rsync翻译(rsync命令中文手册)

    本文为命令rsync的man文档翻译,几乎所有的选项都翻译了,另外关于筛选规则部分只翻译了一部分.由于原文很多地方都比较啰嗦,所以译文中有些内容可能容易让国人疑惑,所以我个人在某些地方加上了注释.若有 ...

  8. 使用PostgreSQL进行中文全文检索

    code[class*="language-"], pre[class*="language-"] { background-color: #fdfdfd; - ...

  9. ThinkPHP3.2添加scws中文分词

    前言 前一段时间,公司网站做站内搜索,只简单针对输入的文字进行搜索,作全匹配检索,搜索出来的内容很少.如何达到模糊搜索,匹配到更多的内容成了需要解决的问题.于是,今天想到可以做分词检索,如何对输入的一 ...

随机推荐

  1. maven小项目注册服务(二)--captcha模块

    验证码生成模块,配置信息基本和前面的模块一样.account-captcha需要提供的服务是生成随机的验证码主键,然后用户可以使用这个主键要求服务生成一个验证码图片,这个图片对应的值应该是随机的,最后 ...

  2. 车牌识别LPR(六)-- 字符分割

    第六篇:字符分割 在知道了车牌字符的规律之后,可以根据车牌的特点对字符进行分割.一般最容易想到的方法就是根据车牌投影.像素统计特征对车牌图像进行字符分割的方法.是一种最常用的.最基本的.最简单的车牌字 ...

  3. BZOJ3122 随机数生成器

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3122 题意: 思路:(1)x1=t则n=1; (2)a=0,则b=t,n=2;否则无解: ...

  4. 基于Jquery+Ajax+Json+高效分页

    摘要 分页我相信大家存储过程分页已经很熟悉了,ajax更是耳熟能详了,更别说我们的json,等等. 如果说您没用过这些东东的话,我相信看完这篇博文会对您有帮助的,,如果有任何问题不懂或者有bug没问题 ...

  5. python 字符串换行的三种方式

    if __name__ == '__main__': #第一种: 三个单引号 print ''' aaaaaaaaaaaaaaaa         bbbbbbbbbbbbbb''' #第二种: 三个 ...

  6. maven - setting.xml

    <?xml version="1.0" encoding="UTF-8"?> <!-- Licensed to the Apache Soft ...

  7. js风格技巧

    1.一个页面的所有js都可以写成这样,比如:   var index ={};   index.User = ****;   index.Init = function(){ $("$tes ...

  8. 分析一下FastDFS_java_client中TestClient.java这个文件以及跟它关联的这条线

    本来先打算上个图来说明一下这条线的,可是我的画图工具还没有安装好,我先把跟TestClient.java相关的几个文件代码贴上来,但是由于代码行数还是不少的,所以请大家阅读文章的时候先不要展开代码,等 ...

  9. RTP协议之Header结构解析

    实时传输协议 RTP,RTP 提供带有实时特性的端对端数据传输服务,传输的数据如:交互式的音频和视频.那些服务包括有效载荷类型定义,序列号,时间戳和传输监测控制.应用程序在 UDP 上运行 RTP 来 ...

  10. poj 2762 Going from u to v or from v to u?

    题目描述:为了让他们的儿子变得更勇敢些,Jiajia和Wind将他们带到一个大洞穴中.洞穴中有n个房间,有一些单向的通道连接某些房间.每次,Wind选择两个房间x和y,要求他们的一个儿子从一个房间走到 ...