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

(注: 私のアプリでは、タイトルとキーワードの 2 つの列で FULLTEXT を使用しています。この質問では、例として 1 つの列のみをクエリしています。)

すべてのレコードを正常に返しますが、順序がわかりません。スコアが何であり、どこから来たのかは理解できますが、別の順序で表示したいです。上記のクエリは、次のような結果を返します。

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 で他の何よりも「test」の出現が見つかった場合、その行で「car」がまったく見つからなかったにもかかわらず、スコアが高くなりました。実際には、「テスト」と「車」の両方の単語が一致する場所で、スコアを高くしたいと思います。したがって、実際には、行 2 の「ドイツのテストカー」は、両方の単語が含まれているため実際には上位にランク付けされ、2 と 3 は両方の単語が含まれていないため下位にランク付けされる必要があります。が挙げられました。

要するに、一致するすべての単語から始まり、1 つ以上の一致する単語で終わる結果を並べ替え、その単語が実際に言及された回数で並べ替えます。

どうすればこれを達成できますか?

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 に答える