MySQL全文搜索找不到确切的短语

问题描述

我有一个表,该表的列名带有全文索引-

enter image description here

在此表中,有很多行,但其中有些行恰好像这里一样在开始时包含短语“ aberlour 18”-

enter image description here

但是当我使用全文搜索来搜索表格中的确切名称时,-

SELECT * FROM `whiskybase_bottles` WHERE MATCH(`name`) AGAINST('Aberlour 18 year old')

仅在第六名找到它-

enter image description here

如何改进它以便首先找到它?

我不想使用“喜欢”搜索,因为在其他情况下,全文可以更好地满足我的需求。

我已经将“ innodb ft最小令牌大小”参数减小为2,而不是3,以包含age语句,并在它之后重新创建了索引-

enter image description here

解决方法

如果要搜索确切的词组,则需要在该词组周围使用双引号,以便FTS以相同的词序与之完全匹配。

来自FTS Documentation

用双引号(“)括起来的短语仅与按字面意义包含该短语的行匹配(如键入时一样)。全文引擎将其分解为单词,并在FULLTEXT索引中搜索该单词。非单词字符不需要完全匹配:短语搜索仅要求匹配包含与短语完全相同且顺序相同的单词。例如,“测试短语”与“测试,短语”匹配。

改为使用以下代码:

SELECT * 
FROM `whiskybase_bottles` 
WHERE MATCH(`name`) AGAINST('"Aberlour 18 year old"' IN BOOLEAN MODE)
,

如果您要查找名称中包含“ Aberlour 18 year old”但不一定包含全名的行,则可以使用用于布尔全文搜索的+运算符。如果没有+运算符,则查询将搜索与搜索完全匹配的短语,并且不会选择包含您想要的其他单词和字符的短语。 您的代码如下所示:

SELECT * 
FROM `whiskybase_bottles` 
WHERE MATCH(`name`) AGAINST('+"Aberlour 18 year old"' IN BOOLEAN MODE)

您可以在此处了解有关BOOLEAN MODE和相关运算符的更多信息: https://www.w3resource.com/mysql/mysql-full-text-search-functions.php

对于带有变量的常规搜索,您可以执行以下操作:

SELECT * 
FROM `whiskybase_bottles` 
WHERE MATCH(`name`) AGAINST(concat('+\"',search_phrase,'\"') IN BOOLEAN MODE)
,

如果您想将确切短语排在最前面。

改用此代码:

SELECT *,MATCH (name) AGAINST( 'Aberlour 18 year old' IN BOOLEAN MODE) as score
 FROM `whiskybase_bottles` 
WHERE MATCH(`name`) AGAINST('Aberlour 18 year old')
 ORDER BY name = 'Aberlour 18 year old' DESC,score DESC

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...