web-dev-qa-db-ja.com

関連性の高い投稿で全文検索

私はカスタム検索ページを作成しています、そして私が必要とするものは関連性によって結果を分類することです(例えばキーワードの発生)。

MySQLドキュメントを使用するこのクエリを作成しました。

SELECT ID
FROM $wpdb->posts
WHERE MATCH (post_title, post_content) AGAINST ('$keyword_list')
AND post_status = 'publish'
AND post_type = 'issue'

問題A)テスト投稿に複数回現れるキーワードを使ってテストした場合、それらの投稿は見つかりますが、関連性によって正しくソートされていません。たとえば、最初に見つかった投稿には約3回のキーワードの出現があり、3位に返された投稿には約15回の出現があります。

問題B)キーワード「medicare」を含む2つの投稿がありますが、「medicare」を検索するとそれらの投稿が返されますが、「medi」を検索すると「medic」 「など、何も返さない。

MATCH/AGAINSTを使用してクエリする方法はありますか。それともLIKE%を使用する必要がありますか。その場合は、関連性でソートする方法があります。

ありがとう

3
Smaug

あなたはSphinx検索エンジンをチェックしたいかもしれません http://sphinxsearch.com/

セットアップして使用方法を習得するのに約1日かかりましたが、関連性と文法ステミングでソートすることで本当に良い仕事をします。また、索引付けにより、ビッグデータセットの全文検索よりも高速です。

1
Aleh

これで問題Bは解決されませんが、問題Aに関する限り、全文検索が自動的に関連性によってソートされるとは思いません。結果に関連性を持たせるためにも、 "AGAINST"句を選択する必要があると確信しています。好きです:

... WHERE MATCH (post_title, post_content) AGAINST ('$keyword_list') as relevance ...
... ORDER BY relevance

しかし、私はAlehにも同意します。もしあなたが洗練された検索を探しているのなら、Sphinxのようにその目的のために設計されたものがおそらく必要でしょう。

0
MathSmath

これはあなたの場合は重要かもしれませんし、重要ではないかもしれませんが、検索するテキストがそれほど多くない場合、FULLTEXT検索は非常に奇妙に機能します。小さなデータセットをテストするのは本当に頭痛の種です。小さなテキストデータセットを扱うときは、ブールモードを試してみてください。

試してみてください...

 WHERE MATCH (post_title, post_content) 
       AGAINST ('keyword keyword keyword' IN BOOLEAN MODE)

関連性による順序付けに関する@ MathSmathのポイントも正しいです。

0
O. Jones