MySql 全文检索

一、概述

全文检索是利用查询关键字和查询列内容之间的相关度进行检索,可以利用全文索引来提高匹配的速度。

引擎支持:全文索引在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:

  1. 结果的相关性排序由高到低
  2. 在对表创建索引时,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

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值