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 ------ 全文本搜索( match和Against),以及查询扩展和 布尔方式(十七)