【IT老齐055】Mysql Ngram全文检索技术
场景
- select * from article where title like Java%
-
可能用到索引,看索引选择性
-
- select * from article where titledlike %Java
-
一定不会用到索引
-
- select * from article where title like%Java%
-
一定不会用到索引
-
解决方案
搜索引擎
- 更高的成本
- 数据一致性如何保证
- ElasticSearch高可用架构采用方案
- 维护ElasticSearch
Mysql Ngram
在 MySQL 5.7.6 之前,全文索引只支持英文全文索引,不支持中文全文索引,需要利用分词器把中文段落预处理拆分成单词,然后存入数据库。
从 MySQL 5.7.6 开始,MySQL内置了ngram全文解析器,用来支持中文、日文、韩文分词
ngram全文解析器
ngram就是一段文字里面连续的n个字的序列。
ngram全文解析器能够对文本进行分词,每个单词是连续的n个字的序列。MySQL 中使用全局变量 ngram_token_size 来配置 ngram 中 n 的大小,它的取值范围是1到10,默认值是 2。通常nqram token size设置为要查询的单词的最小字数。如果需要搜索单字,就要把ngram_token_size设置为1。在默认值是2的情况下,搜索单字是得不到任何结果的。因为中文单词最少是两个汉字,推荐使用默认值2。
使用方式
- 指定分词大小
- 使用启动命令 mysqld 时,添加参数 mysqld --ngram token size=2
- 修改MySQL配置文件 my.ini ,末尾增加一行 ngram_token_size 参数设置
- 创建索引
ALTER TABLE my_table ADD FULLTEXT (content);
- where子句
where MATCH(content) AGAINST ('target' IN NATURAL LANGUAGE MODE);
全文检索模式
- 自然语言模式(NATURAL LANGUAGE MODE)
- 自然语言模式是 MySQL 默认的全文检索模式。
- 自然语言模式不能使用操作符,不能指定关键词必须出现或者必须不能出现等复杂查询。
- BOOLEAN 模式(BOOLEAN MODE)
- BOOLEAN 模式可以使用操作符,可以支持指定关键词必须出现或者必须不能出现或者关键词的权重高还是低等复杂查询。
apple banana
无操作符,表示或,要么包含apple,要么包含banana
+apple +juice
必须同时包含两个词
+apple macintosh
必须包含apple,但是如果也包含macintosh的话,相关性会更高
+apple -macintosh
必须包含apple,同时不能包含macintosh。
+apple ~macintosh
必须包含apple,但是如果也包含macintosh的话,相关性要比不包含macintosh的记录低。
+apple +(>juice <pie)
查询必须包含apple和juice或者apple和pie的记录,但是apple juice的相关性要比apple pie高
apple*i
查询包含以apple开头的单词的记录,如apple、apples、applet
"some words"
使用双引号把要搜素的词括起来,效果类似于like%some words%'
注意
- 只能在类型为 CHAR、VARCHAR 或者 TEXT 的字段上创建全文索引。
- 全文索引只支持 InnoDB 和 MyISAM 引擎。
- MATCH (columnName) AGAINST(keywords)。MATCH)函数使用的字段名,必须要与创建全文索引时指定的字段名一致。
- MATCHO函数使用的字段名只能是同一个表的字段,因为全文索引不能够跨多个表进行检索
- 如果要导入大数据集,使用先导入数据,再在表上创建全文索引的方式,要比先在表上创建全文索引再导入数据的方式快很多