大家好,又见面了,我是你们的朋友全栈君。
##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)
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/151894.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...