ngram便是一段笔墨里面连续的n个字的序列。ngram全文解析器能够对文本进行分词,每个单词是连续的n个字的序列。例如,用ngram全文解析器对“你好天下”进行分词:
Copyn=1: '你', '好', '世', '界' n=2: '你好', '好世', '天下' n=3: '你好世', '好天下' n=4: '你好天下'
MySQL 中利用全局变量 ngram_token_size 来配置 ngram 中 n 的大小,它的取值范围是1到10,默认值是 2。常日ngram_token_size设置为要查询的单词的最小字数。如果须要搜索单字,就要把ngram_token_size设置为 1。在默认值是 2 的情形下,搜索单字是得不到任何结果的。由于中文单词最少是两个汉字,推举利用默认值 2。

咱们看一下Mysql默认的ngram_token_size大小:
Copyshow variables like 'ngram_token_size'
ngram_token_size 变量的两种设置办法:
1、启动mysqld命令时指定
Copymysqld --ngram_token_size=2
2、修正mysql配置文件
Copy[mysqld] ngram_token_size=2
三、全文索引#
以某文书数据为例,新建数据表 t_wenshu ,并且针对文书内容字段创建全文索引,导入10w条测试数据。
1、建表时创建全文索引
CopyCREATE TABLE `t_wenshu` ( `province` varchar(255) DEFAULT NULL, `caseclass` varchar(255) DEFAULT NULL, `casenumber` varchar(255) DEFAULT NULL, `caseid` varchar(255) DEFAULT NULL, `types` varchar(255) DEFAULT NULL, `title` varchar(255) DEFAULT NULL, `content` longtext, `updatetime` varchar(255) DEFAULT NULL, FULLTEXT KEY `content` (`content`) WITH PARSER `ngram`) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2、通过 alter table 办法
CopyALTER TABLE t_wenshu ADD FULLTEXT INDEX content_index (content) WITH PARSER ngram;
3、通过 create index 办法
CopyCREATE FULLTEXT INDEX content_index ON t_wenshu (content) WITH PARSER ngram;
四、检索模式#自然措辞检索#
(IN NATURAL LANGUAGE MODE)自然措辞模式是 MySQL 默认的全文检索模式。自然措辞模式不能利用操作符,不能指定关键词必须涌现或者必须不能涌现等繁芜查询。
布尔检索#(IN BOOLEAN MODE)剔除一半匹配行以上都有的词,例如,每行都有this这个词的话,那用this去查时,会找不到任何结果,这在记录条数特殊多时很有用,缘故原由是数据库认为把所有行都找出来是没故意义的,这时,this险些被当作是stopword(中断词);布尔检索模式可以利用操作符,可以支持指定关键词必须涌现或者必须不能涌现或者关键词的权重高还是低等繁芜查询。
Copy ● IN BOOLEAN MODE的特色: ·不剔除50%以上符合的row。 ·不自动以干系性反向排序。 ·可以对没有FULLTEXT index的字段进行征采,但会非常慢。 ·限定最长与最短的字符串。 ·套用Stopwords。 ● 搜索语法规则: + 一定要有(不含有该关键词的数据条均被忽略)。 - 不可以有(打消指定关键词,含有该关键词的均被忽略)。 > 提高该条匹配数据的权重值。 < 降落该条匹配数据的权重值。 ~ 将其干系性由正转负,表示拥有该字会降落干系性(但不像-将之打消),只是排在较后面权重值降落。 万用字,不像其他语法放在前面,这个要接在字符串后面。 " " 用双引号将一段句子包起来表示要完备符合,不可拆字。
查询扩展检索#
注释:(WITH QUERY EXPANSION)由于查询扩展可能带来许多非干系性的查询,谨慎利用!
1)查询 content 中包含“盗窃罪”的记录,查询语句如下
Copyselect caseid,content, MATCH ( content) AGAINST ('盗窃罪') as score from t_wenshu where MATCH ( content) AGAINST ('盗窃罪' IN NATURAL LANGUAGE MODE)
2)查询 content 中包含“寻衅滋事”的记录,查询语句如下
Copyselect caseid,content, MATCH ( content) AGAINST ('寻衅滋事') as score from t_wenshu where MATCH ( content) AGAINST ('寻衅滋事' IN NATURAL LANGUAGE MODE) ;
3)单个汉字,查询 content 中包含“我”的记录,查询语句如下
Copyselect caseid,content, MATCH ( content) AGAINST ('我') as score from t_wenshu where MATCH ( content) AGAINST ('我' IN NATURAL LANGUAGE MODE) ;
备注:由于设置的全局变量 ngram_token_size 的值为 2。如果想查询单个汉字,须要在配置文件 my.ini 中修正 ngram_token_size = 1 ,并重启 mysqld 做事,此处不做考试测验了。
4)查询字段 content 中包含 “危险驾驶”和“寻衅滋事”的语句如下:
Copyselect caseid,content, MATCH (content) AGAINST ('+危险驾驶 +寻衅滋事') as score from t_wenshu where MATCH (content) AGAINST ('+危险驾驶 +寻衅滋事' IN BOOLEAN MODE);
5)查询字段 content 中包含 “危险驾驶”,但不包含“寻衅滋事”的语句如下:
Copyselect caseid,content, MATCH (content) AGAINST ('+危险驾驶 -寻衅滋事') as score from t_wenshu where MATCH (content) AGAINST ('+危险驾驶 -寻衅滋事' IN BOOLEAN MODE);
6)查询字段 conent 中包含“危险驾驶”或者“寻衅滋事”的语句如下:
Copyselect caseid,content, MATCH (content) AGAINST ('危险驾驶 寻衅滋事') as score from t_wenshu where MATCH (content) AGAINST ('危险驾驶 寻衅滋事' IN BOOLEAN MODE);
1)利用 Mysql 全文索引之前,搞清楚各版本支持情形;2)全文索引比 like + % 快 N 倍,但是可能存在精度问题;3)如果须要全文索引的是大量数据,建议先添加数据,再创建索引;4)对付中文,可以利用 MySQL 5.7.6 之后的版本,或者 Sphinx、Lucene 等第三方的插件;5)MATCH()函数利用的字段名,必须要与创建全文索引时指定的字段名同等,且只能是同一个表的字段不能跨表;
末了,小编想说:我是一名python开拓工程师,整理了一套最新的python系统学习教程,想要这些资料的可以关注私信小编“01”即可,希望能对你有所帮助。