mysql全文索引详解_MySql全文索引详解

2022-06-24 20:03:27 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

MySql全文索引详解

InnoDB引擎对FULLTEXT索引的支持是MySQL5.6新引入的特性,之前只有MyISAM引擎支持FULLTEXT索引。所谓全文索引,是一种通过建立倒排索引,快速匹配文档的方式。对于FULLTEXT索引的内容可以使用MATCH(column)…AGAINST(val)语法进行查询。

MySQL支持三种模式的全文检索模式:

自然语言模式(IN NATURAL LANGUAGE MODE),即通过MATCH AGAINST 传递某个特定的字符串来进行检索。该模式是MySQL默认使用的。

布尔模式(IN BOOLEAN MODE),可以为检索的字符串增加操作符,例如“ ”表示必须包含,“-”表示不包含,“*”表示通配符(这种情况, 即使传递的字符串较小或出现在停词中,也不会被过滤掉),其他还有很多特殊的布尔操作符, 具体可参考官方文档。

查询扩展模式 (WITH QUERY EXPANSION), 这种模式是自然语言模式下的一个变种,会执行两次检索,第一次使用给定的短语进行检索,第二次是结合第一次相关性比较高的行进行检索。

注意点

目前MySQL支持在CHAR、VARCHAR、TEXT类型的列上定义全文索引。全文索引以词为基础的,MySQL默认的分词是所有非字母和数字的特殊符号都是分词符,包含空格。

MySQL指定了最小字符长度,默认是4,必须要匹配大于4的才会有返回结果,可以用SHOW VARIABLES LIKE ‘ft_min_word_len’ 来查看指定的字符长度,也可以在mysql配置文件my.ini 更改最小字符长度,方法是在my.ini 增加一行 比如:ft_min_word_len = 2,改完后重启mysql即可

MySQL在集合查询中的对每个合适的词都会先计算它们的权重,一个出现在多个文档中的词将有较低的权重(可能甚至有一个零权重),因为在这个特定的集中,它有较低的语义值。否则,如果词是较少的,它将得到一个较高的权重,mysql默认的阀值是50%。如果不考虑权重,可以使用MySQL提供的布尔全文检索。

创建全文索引:

ALTER TABLE table ADD FULLTEXT INDEX idxName(column1(len),column2(len)..)

CREATE FULLTEXT INDEX idxName ON table (column((len)))

删除索引

ALTER TABLE table DROP INDEX idxName

DROP INDEX idxName ON table

示例

SELECT title from tmp WHERE MATCH(title) AGAINST(‘今日头条’)

2. 空(也就是默认情况),表示可选的,包含该词的顺序较高

SELECT title from t_full_text WHERE MATCH(title) AGAINST(‘今日头条 火箭赢了’)

3. 用在词的前面,表示一定要包含该词,并且必须在开始位置 -不包含该词,不能单独使用

SELECT title from tmpWHERE MATCH(title) AGAINST(‘ 今日头条 -NBA’ IN BOOLEAN MODE)

4. 匹配度高的排前面

SELECT title from t_full_text WHERE MATCH(title) AGAINST(‘ 今日头条 NBA’ IN BOOLEAN MODE)

PS:匹配度高的排前面 5. ~表示拥有该字会降低相关性,如果同时包含~后面的字符,排名就会靠后

SELECT title from t_full_text WHERE MATCH(title) AGAINST(‘今日头条 ~NBA’ IN BOOLEAN MODE)

SELECT title from t_full_text WHERE MATCH(title) AGAINST(‘”今日头条 UC头条”‘ IN BOOLEAN MODE)

7. > :提高该字的相关性,查询的结果会排在比较靠前的位置。

SELECT title from t_full_text WHERE MATCH(title) AGAINST(‘ 今日头条 >NBA’ IN BOOLEAN MODE)

8. < :降低相关性,查询的结果会排在比较靠后的位置

SELECT title from t_full_text WHERE MATCH(title) AGAINST(‘ 今日头条

9. <>两者结合使用

SELECT title from t_full_text WHERE MATCH(title) AGAINST(‘ 今日头条 >NBA

10. ()使用,可以通过括号来使用字条件。

SELECT title from t_full_text WHERE MATCH(title) AGAINST(‘ 今日头条 (>NBA

PS: 找到有今日头条&NBA&火箭赢了,今日头条&NBA或者今日头条&火箭赢了的数据,然后排序规则为:今日头条&NBA > 今日头条&NBA&火箭赢了 > 今日头条&火箭赢了。

* :通配符,前后都有通配符

SELECT title from t_full_text WHERE MATCH(title) AGAINST(‘*今日头条*’ IN BOOLEAN MODE)

12. 前面有通配符

SELECT title from t_full_text WHERE MATCH(title) AGAINST(‘*今日头条’ IN BOOLEAN MODE)

13. 后面有通配符

SELECT title from t_full_text WHERE MATCH(title) AGAINST(‘今日头条*’ IN BOOLEAN MODE)

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/151894.html原文链接:https://javaforall.cn

0 人点赞