还可以通过SQL语句查询相关性:
SELECT*,MATCH ( title, body ) against ( 'MySQL' ) AS Relevance FROMfts_articles;

文章插图
相关性的计算依据以下四个条件:
- word 是否在文档中出现
- word 在文档中出现的次数
- word 在索引列中的数量
- 多少个文档包含该 word
- 查询的 word 在 stopword 列中,忽略该字符串的查询
- 查询的 word 的字符长度是否在区间 [innodb_ft_min_token_size,innodb_ft_max_token_size] 内
SELECT*,MATCH ( title, body ) against ( 'for' ) AS Relevance FROMfts_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
- " :表示短语
demo1:+ -
SELECT* FROM`fts_articles` WHEREMATCH ( title, body ) AGAINST ( '+MySQL -YourSQL' IN BOOLEAN MODE );上述语句,查询的是包含 'MySQL' 但不包含 'YourSQL' 的信息
文章插图
demo2: no operator
SELECT* FROM`fts_articles` WHEREMATCH ( title, body ) AGAINST ( 'MySQL IBM' IN BOOLEAN MODE );上述语句,查询的 'MySQL IBM' 没有 '+','-'的标识,代表 word 是可选的,如果出现,其相关性会更高
文章插图
demo3:@
SELECT* FROM`fts_articles` WHEREMATCH ( title, body ) AGAINST ( '"DB2 IBM"@3' IN BOOLEAN MODE );上述语句,代表 "DB2" ,"IBM"两个词之间的距离在3字节之内
文章插图
demo4:> <
SELECT* FROM`fts_articles` WHEREMATCH ( title, body ) AGAINST ( '+MySQL +(>database <DBMS)' IN BOOLEAN MODE );上述语句,查询同时包含 'MySQL','database','DBMS' 的行信息,但不包含'DBMS'的行的相关性高于包含'DBMS'的行 。
文章插图
demo5: ~
SELECT* FROM`fts_articles` WHEREMATCH ( title, body ) AGAINST ( 'MySQL ~database' IN BOOLEAN MODE );上述语句,查询包含 'MySQL' 的行,但如果该行同时包含 'database',则降低相关性 。
推荐阅读
- 缓存穿透解决方案
- Prometheus + Granafa 构建MySQL监控平台
- MySQL死锁分析:记一次因索引合并导致的MySQL死锁分析过程
- MySQL 读写分离
- 数据库MYSQL的查询
- MySQL 8.0新特性之隐藏字段的深入讲解
- 想MYSQL数据库运维高效,这些开发规范总结,参考着用
- ubuntu18.04中Mysql5.7数据库安装及远程登录
- MySQL不同版本多实例部署
- 对MySQL底层索引深度解析
