MySQL 全文搜索以布尔模式按相关性排序

Posted

技术标签:

【中文标题】MySQL 全文搜索以布尔模式按相关性排序【英文标题】:MySQL full text search in boolean mode order by relevance 【发布时间】:2020-03-28 18:02:00 【问题描述】:

我正在尝试在 mysql 中以布尔模式构建全文搜索。

首先我尝试了这个,因为我读到如果你使用 WHERE,它将自动按相关性返回结果:

SELECT DISTINCT word1, lang1, lang2, row_type FROM translations WHERE MATCH (word1) AGAINST ('$search' IN BOOLEAN MODE)

因此不会发生按相关性排序。 然后我尝试了以下方法:

$sql = "SELECT *, MATCH(word1) AGAINST ('$search' IN BOOLEAN MODE) AS relevance FROM `translations` WHERE MATCH(word1) AGAINST ('$search' IN BOOLEAN MODE) ORDER BY relevance DESC";

这只是根据匹配的单词数对匹配项进行排名,然后按 ID 号列出它们。除了匹配的词数之外,没有相关性搜索。

例如,如果我搜索“红色汽车”一词,它会返回:

1. red car is nice
2. red car
3. the car has a very nice color
4. car

我希望“汽车”这个词出现在“汽车的颜色很漂亮”之前

使用 BOOLEAN MODE 时的相关数字是表示匹配单词数的整数。

当我使用自然语言模式时,相关数字是精细的十进制数字,并且相关搜索工作正常。

如何在 BOOLEAN MODE 中获得真正相关的结果列表?

【问题讨论】:

【参考方案1】:

首先,您希望按相关性进行排序。 你期望所有的信息 你能试试吗 SELECT * FROM TEST_BOOLEAN WHERE ID_1;

【讨论】:

【参考方案2】:

你的 MySQL 版本是多少?

我确实记得它在布尔模式下没有任何相关性。这只是 TRUE/FALSE (1/0)。我以前在 WHERE 子句中使用布尔模式,在 SELECT/ORDER 子句中使用自然语言模式。

你也可以尝试做这样的事情:

SET @search = 'red car';

SELECT
      *
    , MATCH(word1) AGAINST (@search IN BOOLEAN MODE) AS relevance
FROM
    translations
WHERE
    MATCH(word1) AGAINST (@search IN BOOLEAN MODE)
ORDER BY
      relevance DESC
    , LENGTH(word1) ASC
;

因此,如果两条记录具有相同的相关性,则较短的一条将是第一个。

【讨论】:

MySQL 55.7.23,您的解决方案是我不得不求助的解决方案,尽管我希望有更优雅的可能性。

以上是关于MySQL 全文搜索以布尔模式按相关性排序的主要内容,如果未能解决你的问题,请参考以下文章

Mysql全文搜索,自然语言模式:按“亲密度”排序

mysql全文搜索相关性得分不正确

全文搜索按相关性分数排序

MySQL ------ 全文本搜索( match和Against),以及查询扩展和 布尔方式(十七)

MySQL ------ 全文本搜索( match和Against),以及查询扩展和 布尔方式(十七)

MySQL FULLTEXT全文索引