【问题标题】:Mysql fulltext search didn't find exact phraseMysql全文搜索没有找到确切的短语
【发布时间】:2020-12-02 05:47:31
【问题描述】:

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

在这个表中有很多行,但其中一些包含短语“aberlour 18”,就像这里一样 -

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

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

它只在第 6 位找到它 -

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

我不想使用“LIKE”搜索,因为全文在其他情况下更适合我的需求。

我已经将“innodb ft min token size”参数减少为 2 而不是 3 以包含年龄语句并在其后重新创建索引 -

【问题讨论】:

  • 您是否在 更改 ft_min_token_size 之后重建了有问题的 FT 索引?
  • 是的,就像我写的那样,我在更改后重新创建了它
  • 您能提供一个简单的测试用例供我们使用吗? idname 列只有几十行。请验证测试是否失败。

标签: mysql search indexing full-text-search full-text-indexing


【解决方案1】:

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

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)

【讨论】:

  • 是的,我知道这个功能,但是没有它就找不到它的原因是什么?在这个解决方案中,当搜索短语不准确时它会很糟糕......我需要一个通用的解决方案
  • 它没有找到它,因为它正在搜索与字符串完全匹配的条目,而不是包含字符串但具有更多字符的条目。加号是查找不准确但包含在短语中的字符串所必需的。如果您要搜索的词组中的词的顺序不准确,也可以在每个词的前面加上一个加号。
【解决方案2】:

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

改用此代码:

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

【讨论】:

    猜你喜欢
    • 2016-01-26
    • 1970-01-01
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    相关资源
    最近更新 更多