FULLTEXT - 通过匹配单词匹配得分,然后匹配出现次数

时间:2012-07-12 15:27:00

标签: sql

我很难找到按照特定顺序排序我的MySQL FULLTEXT结果的方法。假设我有这些记录:

ID  |   Title                              
----+-----------------------------------
1   |   Test test test truck from a test company.
2   |   Test car from Germany.
3   |   A car from London.

现在,如果我运行以下查询:

SELECT id, MATCH (title,keywords) AGAINST ('test car') AS score
FROM titles_tbl
WHERE MATCH (title,keywords) AGAINST ('test car')
ORDER BY score DESC

(注意:在我的应用程序中,我在两列,标题和关键字中使用FULLTEXT。在这个问题中,我只是查询一列作为示例。)

它会返回所有记录,但顺序让我感到困惑。我可以理解分数是什么,它来自哪里,但我想以不同的顺序。上面的查询将返回与此类似的结果:

ID  |   Title                                            | Score
----+----------------------------------------------------+---------
1   |   Test test test truck from a test company.        | 1.5
2   |   Test car from Germany.                           | 1.0
3   |   A car from London.                               | 0.5

如果发现“测试”出现的次数多于第1行中的任何其他值,那么即使在该行中根本找不到“汽车”,它也会得分更重。我真的希望它在“测试”和“汽车”两个词的匹配时得分更重。因此,实际上,第2行“来自德国的试车”实际上应该排名更高,因为它包含两个单词,而2和3应该排名较低,因为它们不包含两个单词但是应该排序多少次被提到了。

因此,简而言之,我想从所有匹配的单词开始,以一个或多个匹配的单词结束,然后按实际提到的单词的次数排序,我的结果。

我如何实现这一目标?

1 个答案:

答案 0 :(得分:1)

尝试IN BOOLEAN MODE:

mysql> select id, title, MATCH(title) against ('test car' in boolean mode) m  
         from titles_tbl 
        order by MATCH(title) against ('test car' in boolean mode) desc\G 
*************************** 1. row ***************************
id: 2
title: Test car from Germany
m: 2
*************************** 2. row ***************************
id: 1
title: Test test test truck from a test company.
m: 1
*************************** 3. row ***************************
id: 3
title: A car from London
m: 1
3 rows in set (0.00 sec)

我在MySQL 5.5上测试了这个。如果IN BOOLEAN MODE未对搜索进行正确评分,请确保您运行的是最新版本。