2017-10-24 2 views
0

今日、mysqls MATCH()... AGAINST()を使用して問題が発生しました。mysqls MATCH()との関連性が完全に上の数値と一致する

私の問題を解決するのが簡単かもしれないと思うので、私は小さなSQLFiddleを作成しました。

私は完全に理解していますが、この「選択」の仕方では「Foo Bar Foo」が「Foo Bar」より関連性が高いのはなぜですか?しかし、私が望むのは、「フルマッチング」という用語は、「フルマッチングと少しだけ」という用語より高い関連性で扱われるということです。

title   relevance 
Foo Bar  0.046829063445329666 
Foo Bar Foo 0.031219376251101494 
Foo   0 
Bar   0 

"union"を使用して2つのステートメントを結合しなくても、この結果は可能ですか?

回答(ゴードン・リノフのおかげで):

SELECT * 
FROM FOOBAR 
WHERE title LIKE '%Foo Bar%' 
ORDER BY (CASE WHEN title LIKE 'Foo Bar%' THEN 1 ELSE 0 end) DESC, 
     MATCH (title) AGAINST ('Foo Bar' IN BOOLEAN MODE) ASC 

答えて

1

あなたはorder byでやりたいことができます。一つの方法は、関連性の上昇で一致し、各グループ内で異なる言葉、注文の数をカウントするために、次のようになります。

SELECT fb.*, 
     MATCH (title) AGAINST ('+Foo +Bar' IN BOOLEAN MODE) AS relevance 
FROM FOOBAR fb 
ORDER BY ((case when title like '%Foo%' then 1 else 0 end) + 
      (case when title like '%Bar%' then 1 else 0 end) 
     ) desc, 
     relevance asc 

これは、あなたがサンプルデータのために欲しいものを行います。関連性の計算には、単語が一致する回数と文字列の長さ以外の要因が含まれているため、一般的には機能しない可能性があります。

+0

私が欲しかったこと!ありがとう!私は私の - 少し修正されたバージョンで私のスタートポストを更新します。 :) –

関連する問題