1. ホーム
  2. mysql

[解決済み] MySQL match() against() - 関連性とカラムによる順序?

2023-07-14 17:32:24

質問

さて、複数カラムの全文検索をしたいのですが、こんな簡単なものでいいでしょうか?

SELECT * FROM pages WHERE MATCH(head, body) AGAINST('some words' IN BOOLEAN MODE)

今度は関連性(いくつの単語が見つかったか)で並べたいのですが、これは次のようなものでできました。

SELECT * , MATCH (head, body) AGAINST ('some words' IN BOOLEAN MODE) AS relevance 
FROM pages
WHERE MATCH (head, body) AGAINST ('some words' IN BOOLEAN MODE)
ORDER BY relevance

さて、ここからが迷うところなのですが、関連性を優先させたいのは head の列に関連性を優先させたいのです。

関連性のあるカラムを2つ作ればいいんだろうけど、1つは headbody しかし、その時点で、テーブルの中で同じ検索を3回行うことになります。この関数を作成する目的では、クエリが他のテーブルに対して結合および照合されるため、パフォーマンスが重要です。

それで、私の主な質問は 関連性を検索し、特定の列に優先順位を付けるより高速な方法はありますか?(そして、ボーナスとして、おそらく、関連性が列の中で単語が出現する回数を数えるようにすることができますか?)

何か提案やアドバイスがあれば、とてもうれしいです。

注意してください。 私はこれをLAMP-server上で実行する予定です。(ローカルテストではWAMP)

どのように解決するのですか?

これは は、あなたが望むように、頭の部分との関連性を高めることができます。倍にはなりませんが、あなたにとっては十分な効果があるかもしれません。

SELECT pages.*,
       MATCH (head, body) AGAINST ('some words') AS relevance,
       MATCH (head) AGAINST ('some words') AS title_relevance
FROM pages
WHERE MATCH (head, body) AGAINST ('some words')
ORDER BY title_relevance DESC, relevance DESC

-- alternatively:
ORDER BY title_relevance + relevance DESC

DB エンジンを変更する柔軟性があるのであれば、次のような選択肢も検討してみてください。 ポストグレス . これは、演算子の重みを設定し、ランキングで遊ぶことができます。