SELECT
count(IF(MATCH ( title, body )
against ( ‘MySQL’ ), 1, NULL )) AS count
FROM
fts_articles
;
复制代码
上述两种语句虽然得到的结果是一样的,但从内部运行来看,第二句SQL的执行速度更快些,因为第一句SQL(基于where索引查询的方式)还需要进行相关性的排序统计,而第二种方式是不需要的。
还可以通过SQL语句查询相关性:
SELECT
*,
MATCH ( title, body ) against ( ‘MySQL’ ) AS Relevance
FROM
fts_articles;
复制代码
相关性的计算依据以下四个条件:
-
word 是否在文档中出现
-
word 在文档中出现的次数
-
word 在索引列中的数量
-
多少个文档包含该 word
对于 InnoDB 存储引擎的全文检索,还需要考虑以下的因素:
-
查询的 word 在 stopword 列中,忽略该字符串的查询
-
查询的 word 的字符长度是否在区间 [innodb_ft_min_token_size,innodb_ft_max_token_size] 内
如果词在 stopword 中,则不对该词进行查询,如对 ‘for’ 这个词进行查询,结果如下所示:
SELECT
*,
MATCH ( title, body ) against ( ‘for’ ) AS Relevance
FROM
fts_articles;
复制代码
可以看到,'for’虽然在文档 2,4中出现,但由于其是 stopword ,故其相关性为0
参数 innodb_ft_min_token_size 和 innodb_ft_max_token_size 控制 InnoDB 引擎查询字符的长度,当长度小于 innodb_ft_min_token_size 或者长度大于 innodb_ft_max_token_size 时,会忽略该词的搜索。在 InnoDB 引擎中,参数 innodb_ft_min_token_size 的默认值是3,innodb_ft_max_token_size的默认值是84
Boolean
布尔搜索使用特殊查询语言的规则来解释搜索字符串,该字符串包含要搜索的词,它还可以包含指定要求的运算符,例如匹配行中必须存在或不存在某个词,或者它的权重应高于或低于通常情况。例如,下面的语句要求查询有字符串"Pease"但没有"hot"的文档,其中+和-分别表示单词必须存在,或者一定不存在。
select * from fts_test where MATCH(content) AGAINST(‘+Pease -hot’ IN BOOLEAN MODE);
复制代码
Boolean 全文检索支持的类型包括:
-
+:表示该 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
-
" :表示短语
下面是一些demo,看看 Boolean Mode 是如何使用的。
demo1:+ -
SELECT
FROM
fts_articles
WHERE
MATCH ( title, body ) AGAINST ( ‘+MySQL -YourSQL’ IN BOOLEAN MODE );
复制代码
上述语句,查询的是包含 ‘MySQL’ 但不包含 ‘YourSQL’ 的信息
demo2: no operator
SELECT
FROM
fts_articles
WHERE
MATCH ( title, body ) AGAINST ( ‘MySQL IBM’ IN BOOLEAN MODE );
复制代码
上述语句,查询的 ‘MySQL IBM’ 没有 ‘+’,'-'的标识,代表 word 是可选的,如果出现,其相关性会更高
demo3:@
SELECT
FROM
fts_articles
WHERE
MATCH ( title, body ) AGAINST ( ‘“DB2 IBM”@3’ IN BOOLEAN MODE );
复制代码
上述语句,代表 “DB2” ,"IBM"两个词之间的距离在3字节之内
demo4:> <
SELECT
FROM
fts_articles
WHERE
MATCH ( title, body ) AGAINST ( ‘+MySQL +(>database <DBMS)’ IN BOOLEAN MODE );
复制代码
上述语句,查询同时包含 ‘MySQL’,‘database’,‘DBMS’ 的行信息,但不包含’DBMS’的行的相关性高于包含’DBMS’的行。
demo5: ~
SELECT
FROM
fts_articles
WHERE
MATCH ( title, body ) AGAINST ( ‘MySQL ~database’ IN BOOLEAN MODE );
复制代码
上述语句,查询包含 ‘MySQL’ 的行,但如果该行同时包含 ‘database’,则降低相关性。
demo6:*
SELECT
FROM
fts_articles
WHERE
MATCH ( title, body ) AGAINST ( ‘My*’ IN BOOLEAN MODE );
复制代码
上述语句,查询关键字中包含’My’的行信息。
demo7:"
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
面试题总结
其它面试题(springboot、mybatis、并发、java中高级面试总结等)
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!
.cn/images/e5c14a7895254671a72faed303032d36.jpg" alt=“img” style=“zoom: 33%;” />
面试题总结
其它面试题(springboot、mybatis、并发、java中高级面试总结等)
[外链图片转存中…(img-8m33p0RP-1711803005352)]
[外链图片转存中…(img-U8VdZNhG-1711803005352)]
[外链图片转存中…(img-WsJlNNTi-1711803005353)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!