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

一 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. tomcat升级问题

    在本地开发使用myeclipse6.5自带tomcat,部署到服务器上是7.x,导致jsp页面无法解析. 所以想着在本地也使用tomcat7部署,myeclipse6.5不支持tomcat7.x,到网 ...

  2. openfire的smack和asmack

    smack你可以看成是一套封装好了的用于实现XMPP协议传输的API,它是一个非常简单并且功能强大的类库,给用户发送消息只需要三行代码.下载地址:http://www.igniterealtime.o ...

  3. 语言基础:C#输入输出与数据类型及其转换

    今天学习了C#的定义及特点,Visual Studio.Net的集成开发环境和C#语言基础. C#语言基础资料——输入输出与数据类型及其转换 函数的四要素:名称,输入,输出,加工 输出 Console ...

  4. Java语言基本语法

    Java语言基本语法 一.标识符和关键字 标识符 在java语言中,用来标志类名.对象名.变量名.方法名.类型名.数组名.包名的有效字符序列,称为“标识符”: 标识符由字母.数字.下划线.美元符号组成 ...

  5. git版本库底层命令

    当我们在使用git的时候,有时候需要知道当前文件夹相对于工作目录根目录的相对路径等等,那么我们可以使用 git rev-parse 添加一个参数就可以实现,如: 显示当前仓库版本库 .git 目录所在 ...

  6. 好!recover-binary-search-tree(难)& 两种好的空间O(n)解法 & 空间O(1)解法

    https://leetcode.com/mockinterview/session/result/xyc51it/https://leetcode.com/problems/recover-bina ...

  7. poj 1195 Mobile phones(二维树状数组)

    树状数组支持两种操作: Add(x, d)操作:   让a[x]增加d. Query(L,R): 计算 a[L]+a[L+1]……a[R]. 当要频繁的对数组元素进行修改,同时又要频繁的查询数组内任一 ...

  8. UVa 10288 (期望) Coupons

    题意: 每张彩票上印有一张图案,要集齐n个不同的图案才能获奖.输入n,求要获奖购买彩票张数的期望(假设获得每个图案的概率相同). 分析: 假设现在已经有k种图案,令s = k/n,得到一个新图案需要t ...

  9. bzoj3261: 最大异或和

    可持久化trie.又是%%%Xs酱... #include<cstdio> #include<cstring> #include<iostream> #includ ...

  10. Java知识点:琐碎知识点(3)

    零碎 switch(x),x只可以是enum或byte.short.char.int. 枚举在switch-case语句作为标签时必须是枚举常量的非限定名称,否则Compile Error. Enum ...