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

use*_*591 23 php mysql sorting full-text-search

我对MYSQL比较陌生,并且有一个问题一直困扰着我.我已经尝试使用谷歌搜索到答案的地方,但还没有找到一个可接受的解决方案.

以下是我目前正在运行的查询,以查找给定搜索字词的最佳匹配:

$query="SELECT * from `vocabulary` WHERE translation = 'word' OR translation LIKE '%word%'";
Run Code Online (Sandbox Code Playgroud)

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


1 | 单词<-exact match
2 | 填字游戏< - 按字母顺序排序的部分匹配/
3 | 字
4 | 语言大师


非常感谢您的帮助.

-macspacejunkie

ins*_* me 29

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


Ric*_*ams 22

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

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

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
Run Code Online (Sandbox Code Playgroud)

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

  • 当在WHERE子句中使用MATCH命令时,MySQL会自动将行从最高到最低相关性排序. (14认同)

Ras*_*dit 15

SELECT * from vocabulary 
WHERE translation like 'word'  
union all
SELECT * from vocabulary 
WHERE translation LIKE '%word%' and translation not like 'word'  
Run Code Online (Sandbox Code Playgroud)

将首先列出完全匹配

  • 这是在大型表中执行操作的非常糟糕的方法。考虑使用“ FULLTEXT”搜索进行更快的查询 (2认同)

chr*_*acp 5

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

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

我的第一个MATCH()将使用双引号检查文字(或精确)搜索词我的第二个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
Run Code Online (Sandbox Code Playgroud)

如果你运行使用EXPLAIN函数来显示查询是如何工作的,你会发现额外的MATCH()AGAINST()子句实际上并没有因为MySQL的工作方式而给查询添加任何开销.