问题描述
我有一个表,该表的列名带有全文索引-
在此表中,有很多行,但其中有些行恰好像这里一样在开始时包含短语“ aberlour 18”-
但是当我使用全文搜索来搜索表格中的确切名称时,-
SELECT * FROM `whiskybase_bottles` WHERE MATCH(`name`) AGAINST('Aberlour 18 year old')
仅在第六名找到它-
如何改进它以便首先找到它?
我不想使用“喜欢”搜索,因为在其他情况下,全文可以更好地满足我的需求。
我已经将“ innodb ft最小令牌大小”参数减小为2,而不是3,以包含age语句,并在它之后重新创建了索引-
解决方法
如果要搜索确切的词组,则需要在该词组周围使用双引号,以便FTS以相同的词序与之完全匹配。
用双引号(“)括起来的短语仅与按字面意义包含该短语的行匹配(如键入时一样)。全文引擎将其分解为单词,并在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