一、概述
全文检索是利用查询关键字和查询列内容之间的相关度进行检索,可以利用全文索引来提高匹配的速度。
引擎支持:全文索引在MySql中很早就已支持,不过5.6以前只有 MyISAM 引擎支持,5.6以后 InnoDB 也开始支持全文检索。不过一直以来默认的全文索引 parser 只适合于Latin,因为Latin是通过空格来分词的。但对于像中文,日文和韩文来说,没有这样的分隔符,一个词可以由多个字来组成就显得不合适。
但从MySql 5.7开始,内置了n-gram
全文索引插件开始支持中文。
二、可选参数
若使用 ngram 索引插件,则可在MySql配置文件 my.ini 中设置分词大小(默认为2)
分词的 Size 越小,索引的体积就越大,所以要根据具体情况来设置合适的大小
如:
[mysqlId]
ngram_token_size=2
含义:
例如:"信息系统"在设置为不同值时的分词情况
ngram_token_size=1 信,息,系,统
ngram_token_size=2 信息,息系,系统
ngram_token_size=3 信息系,息系统
ngram_token_size=4 信息系统
三、使用流程
1. 建立全文索引
建立索引字段:
根据需求确定,哪些字段需要单独检索或是联合检索就建立哪些字段。
如:title,content 需要一起检索,那就建立联合索引;需要分别单独检索,就单独建立索引
注:该索引可用于char、varchar、text字段
建立方式:
建表时添加:
FULLTEXT (title,content) WITH PARSER ngram
或者之后再添加:
create FULLTEXT index `fullIndex` on article(title,content) with parser ngram;
或
ALTER TABLE article ADD FULLTEXT INDEX ngram_idx(ti
tle,content) WITH PARSER ngram;
2. 查询语法
select * from article where match(col1,col2…) against(‘keywords’ [search_modifier]);
解释:
- col1,col2:需要被查询的列
- ‘keywords’:搜索内容
- [search_modifer]:可选,搜索模式
例:
select * from article where match(title, content) against ('安卓分类');
3. 检索方式详解
1. in natural language mode(自然语言模式)
在该模式下,查询将被转换为n-gram分词查询的并集,如:(‘分类安卓’)转换为(‘分类 类安 安卓’)
未指定模式时,默认为该模式
例:
2. IN BOOLEAN MODE(布尔模式)
该模式,可以为检索的字符串增加操作符,且不会像自然语言一样自动拆词查询并集(除非手动空格隔开)
如:
表示搜索结果必须带有"安卓"和"分类"两词的结果
注:(未验证)有其他资料讲该模式还能解除50%限制(若一个关键词在50%数据出现,那么该词会被当做无效词)
操作符搜索规则:
- 不加操作符:表示该词是可选的,含有该词相关性将更高(如 against(‘安卓 分类’) in boolean mode)
- + :一定要有该关键词(不含有的数据条目将忽略)
- - :不可以有该关键词(排除指定关键词,含有该词的条目将忽略)
- > :提高该词的权重(影响结果排序)
- < :降低该词的权重
- ~ :将该关键词权重由正转负(含有该词的条目,将降低权重排在后面)
- * :关键字后面,表示通配符
- “” :双引号括起来表示为一个短句(可用来解决空格短句问题,如 against(’“安卓 分类”’ in boolean mode),此处"安卓 分类"是一个不可拆分的短句,而不是搜索含有安卓或分类两词的结果)
3. WITH QUERY EXPANSION(查询扩展模式)
当查询需要获取implied knowledge(隐含知识)时则使用该模式
比如:对于单词 database 的查询,用户可能希望查询的不仅仅是包含 database 的文档,还指那些包含mysql、oracle、db2的单词(前提是包含 database 的文档中出现过 mysql、oracle等词)
原理:会先根据给定关键字先进行自然语言查询(该次查询的结果权重最高的),再根据查询到的条目中所包含的其他词再进行一次查询
例:
分析:该模式下,会用"哈皮狗"用自然语言模式进行第一次查询,所以会将(“哈皮狗”)分成(“哈皮”)(“皮狗”)两个分词,含有的就将会被查到。因此能查到标题为"一篇哈皮作文"的条目,然后在该条目中,因为又包含了"一篇"这个词,所以可以查出后面那些包含了"一篇"的结果
常见问题 Tip:
- 结果的相关性排序由高到低
- 在对表创建索引时,Workbeanch 至少6.3及以前的版本都不支持 with parse 这种写法。可以执行,但建立索引后将无法再在可视化界面修改表,会报 DDL 错误
部分参考,或许也存在我不认同的地方,仅做标明:
nparse插件官方文档 https://dev.mysql.com/doc/refman/5.7/en/fulltext-search-ngram.html
https://www.cnblogs.com/lgms2008/p/7196525.html
https://www.sunzhongwei.com/mysql-full-text-retrieval-scheme-fulltext-indexing
https://www.cnblogs.com/martinzhang/p/3220345.html
https://www.cnblogs.com/zhoujinyi/p/5643408.html
https://www.sunzhongwei.com/mysql-full-text-retrieval-scheme-fulltext-indexing
https://www.jianshu.com/p/645402711dac
https://blog.csdn.net/qq_33663251/article/details/69612619