繁体   English   中英

如何按相关性对MYSQL全文搜索结果进行排序

[英]How to sort MYSQL fulltext search results by relevancy

我对 MYSQL 比较陌生,并且遇到了一个困扰我一段时间的问题。 我试过在谷歌上到处搜索答案,但到目前为止还没有找到可接受的解决方案。

这是我目前正在运行的查询,用于查找给定搜索词的最佳匹配项:

$query="SELECT * from `vocabulary` WHERE translation = 'word' OR translation LIKE '%word%'";

它返回的结果是全面的,因为它们包括所有相关的行。 但是,它们没有按任何特定顺序排序,当我在 PHP 中打印结果时,我希望首先显示完全匹配的那些。 像这样:


1 | word <-完全匹配
2 | 填字游戏 <- 部分匹配按字母顺序排序 /
3 |
4 | 文字匠


非常感谢您的帮助。

-macspacejunkie

LIKE 不是全文搜索 在全文搜索中, MATCH(...) AGAINST(...)返回一个匹配分数,可以粗略地近似为相关性。

您可以通过创建全文索引然后匹配您的搜索词来获得良好的相关性搜索。

所以这样的事情应该有效。

ALTER TABLE `vocabulary` ADD FULLTEXT INDEX `SEARCH`(`translation`);

SELECT *, MATCH(translation) AGAINST ('+word' IN BOOLEAN MODE) AS relevance 
FROM `vocabulary`
WHERE MATCH(translation) AGAINST ('+word' IN BOOLEAN MODE)
ORDER BY relevance DESC

更多信息可以在MySQL 参考手册中找到

SELECT * from vocabulary 
WHERE translation like 'word'  
union all
SELECT * from vocabulary 
WHERE translation LIKE '%word%' and translation not like 'word'  

将首先列出完全匹配

我一直在研究同样的问题,但还没有找到适合我情况的完美答案,但这可能对您有用。 我对全文搜索也很陌生,所以任何专家也可以帮助我。

我在 select 中做了两个 MATCH() AGAINST() 语句,并将每个语句的分数组合起来形成总相关性。 分配不同的乘数允许我配置每组结果的重要性。

我的第一个 MATCH() 将使用双引号检查字面(或精确)搜索词。 我的第二场比赛会正常检查。 我将更高的乘数应用于第一个匹配项,因此如果找到它应该具有更高的相关性值。

像这样的东西。

SELECT *, ((MATCH(indexes) AGAINST ('"search_terms"' IN BOOLEAN MODE) * 10)  
           + (MATCH(indexes) AGAINST ('search_terms' IN BOOLEAN MODE) * 1.5)) AS relevance  
FROM ...
WHERE ...  
      AND (MATCH (indexes) AGAINST ('"search_terms"' IN BOOLEAN MODE) > 0  
           OR MATCH (indexes) AGAINST ('search_terms' IN BOOLEAN MODE) > 0)  
      ...
ORDER BY relevance DESC

如果您使用 EXPLAIN 来检查查询的工作方式,您应该会发现由于 MySQL 的工作方式,额外的 MATCH() AGAINST() 子句实际上并没有给查询增加任何开销。

您的查询只需稍加修改即可获得您要查找的订单。

SELECT * 
FROM vocabulary
WHERE translation LIKE '%word%'
ORDER BY translation <> 'word', translation;

如果translation正好是'word' ,它将位于结果的顶部。 这是因为当存在精确匹配时, translation <> 'word'将为0 ,该匹配出现在所有其他结果将返回的1之前。 由于, translation ,其余结果将在此之后按字母顺序排序。

此查询避免进行两个查询,就像所选答案对其UNION所做的那样。 此外,您的查询不需要translation = 'word' OR translation LIKE '%word%'因为后半部分将始终执行并且是第一部分的超集。

对于那些寻找使用实际全文搜索的答案的人,请参阅其他更受好评的答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM