mysql 全文索引
https://blog.csdn.net/sphinx1122/article/details/104769550/
MATCH(col1,col2,...) AGAINST(expr[search_modifier])
search_modifier:
{
IN NATURAL LANGUAGE MODE
| IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION
| IN BOOLEAN MODE
| WITH QUERY EXPANSION
}
1.
全文索引分为三种类型:自然语言的全文索引(Natural Language)、布尔全文索引(Boolean)和查询扩展搜索。
在不使用in ... mode的情况下,默认采用的是自然语言的全文索引。
1、自然语言的全文索引
自然语言的全文索引可以计算每个文档对象和查询的相关性。
2、布尔全文索引
布尔搜索使用特殊查询语言的规则来解释搜索字符串,该字符串包含要搜索的词,它还可以包含指定要求的运算符,例如匹配行中必须存在或不存在某个词,或者它的权重应高于或低于通常情况。
Boolean 全文检索支持的类型(可以通过ft_boolean_syntax变量来查看)包括:
+:表示该 word 必须存在
-:表示该 word 必须不存在
(no operator)表示该 word 是可选的,但是如果出现,其相关性会更高
@distance表示查询的多个单词之间的距离是否在 distance 之内,distance 的单位是字节,这种全文检索的查询也称为 Proximity Search,如 MATCH(context) AGAINST('"Pease hot"@30' IN BOOLEAN MODE)语句表示字符串 Pease 和 hot 之间的距离需在30字节内
>:表示出现该单词时增加相关性
<:表示出现该单词时降低相关性
~:表示允许出现该单词,但出现时相关性为负
* :表示以该单词开头的单词,如 lik*,表示可以是 lik,like,likes
" :表示短语
3、查询扩展搜索
查询扩展相当于在自然语言索引的结果上,基于结果的关键字再进行一次查询。也就是说分成两个阶段:
-
第一阶段:根据搜索的单词进行全文索引查询
-
第二阶段:根据第一阶段产生的分词再进行一次全文检索的查询
三、注意点
1、自然语言全文索引创建索引时的字段需与查询的字段保持一致,即MATCH里的字段必须和FULLTEXT里的一模一样;
2、自然语言检索时,检索的关键字在所有数据中不能超过50%(即常见词),则不会检索出结果。可以通过布尔检索查询;
3、在mysql的stopword中的单词检索不出结果。可通过SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_DEFAULT_STOPWORD查询所有的stopword。遇到这种情况,有两种解决办法:
(1)stopword一般是mysql自建的,但可以通过设置ft_stopword_file变量为自定义文件,从而自己设置stopword,设置完成后需要重新创建索引。但不建议使用这种方法;
(2)使用布尔索引查询。
4、小于最短长度和大于最长长度的关键词无法查出结果。可以通过设置对应的变量来改变长度限制,修改后需要重新创建索引。
myisam引擎下对应的变量名为ft_min_word_len和ft_max_word_len
innodb引擎下对应的变量名为innodb_ft_min_token_size和innodb_ft_max_token_size
5、MySQL 5.7.6 之前的版本不支持中文,需使用第三方插件
6、全文索引只能在 InnoDB(MySQL 5.6以后) 或 MyISAM 的表上使用,并且只能用于创建 char,varchar,text 类型的列。
原文链接:https://blog.csdn.net/u012690202/article/details/122471831
CREATE FULLTEXT INDEX ft_name ON table_name(name) WITH PARSER NGRAM;
MySQL 5.7开始,MySQL内置了ngram全文检索插件,用来支持中文分词,并且对MyISAM和InnoDB引擎有效。
SELECT * FROM tbk_item_coupon WHERE MATCH(`title`) AGAINST('夏季' IN BOOLEAN MODE)
CREATE TABLE `q` ( `name1` varchar(255) DEFAULT NULL, `pass` varchar(255) DEFAULT NULL, `email` varchar(255) DEFAULT NULL, `site` varchar(255) DEFAULT NULL, `salt` varchar(255) DEFAULT NULL, `other` varchar(255) DEFAULT NULL, `id` int(10) unsigned NOT NULL, `text` text, PRIMARY KEY (`id`), FULLTEXT (name1) WITH PARSER ngram, FULLTEXT (pass) WITH PARSER ngram, FULLTEXT (email) WITH PARSER ngram ) ENGINE=MyISAM DEFAULT CHARSET=gbk
SELECT * FROM q WHERE MATCH(`pass`) AGAINST('yuzha')
参考
1: https://blog.csdn.net/yygg329405/article/details/97110984
2: https://blog.csdn.net/qq_33663251/article/details/69612619
————————————————
原文链接:https://blog.csdn.net/sphinx1122/article/details/104769550/

浙公网安备 33010602011771号