部分的な単語に一致するが、正確な関連性ソートも提供するMySQL検索を実行するにはどうすればよいですか?
SELECT name, MATCH(name) AGAINST ('math*' IN BOOLEAN MODE) AS relevance
FROM subjects
WHERE MATCH(name) AGAINST ('math*' IN BOOLEAN MODE)
ブールモードの問題は、関連性が常に1を返すため、結果の並べ替えがあまり良くないことです。たとえば、検索結果に5の制限を課した場合、返される結果が最も関連性が高いとは思えない場合があります。
自然言語モードで検索した場合、関連性スコアは有用ですが、部分的な単語を照合することはできません。
これらの基準をすべて満たすクエリを実行する方法はありますか?
私がこれまでに得た最高のものは:
SELECT name
FROM subjects
WHERE name LIKE 'mat%'
UNION ALL
SELECT name
FROM subjects
WHERE name LIKE '%mat%' AND name NOT LIKE 'mat%'
しかし、私はLIKE
を使用したくないと思います。
私は1年後にこの(やや)重複した質問で良い解決策を得ました:
この場合、MySQL 5.6の新しいInnoDB全文検索機能が役立ちます。次のクエリを使用します。
SELECT MATCH(column) AGAINST('(Word1* Word2*) ("Word1 Word1")' IN BOOLEAN MODE) score, id, column
FROM table
having score>0
ORDER BY score
DESC limit 10;
どこ ( )
は、単語を部分式にグループ化します。最初のグループにはlike Word%
意味; 2番目は完全に一致する語句を探します。スコアは浮動小数点数として返されます。