2

我正在努力寻找一种按特定顺序排列我的 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 行,“Test car from Germany”实际上应该排名较高,因为它包含两个词,而第 2 和 3 行应该排名较低,因为它们不包含这两个词,但应该按它们的次数排序被提及。

所以,简而言之,我想对我的结果进行排序,从所有匹配的单词开始,以一个或多个匹配的单词结尾,然后按单词实际被提及的次数排序。

我如何实现这一目标?

4

1 回答 1

1

在布尔模式下尝试:

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 未正确评分您的搜索,请确保您运行的是最新版本。

于 2012-08-05T05:06:18.137 回答