3つのフルテキストインデックスを作成する
- a)キーワード列に1つ
- b)コンテンツ列に1つ
- c)キーワードとコンテンツの両方の列に1つ
次に、クエリ:
SELECT id, keyword, content,
MATCH (keyword) AGAINST ('watermelon') AS rel1,
MATCH (content) AGAINST ('watermelon') AS rel2
FROM table
WHERE MATCH (keyword,content) AGAINST ('watermelon')
ORDER BY (rel1*1.5)+(rel2) DESC
重要なのは、rel1
keyword
だけでクエリの関連性を提供します 列(その列にのみインデックスを作成したため)。 rel2
同じことをしますが、content
桁。これで、これら2つの関連性スコアを足し合わせて、好きな重みを適用できます。
ただし、実際の検索にはこれら2つのインデックスのいずれも使用していません。そのためには、両方の列にある3番目のインデックスを使用します。
(keyword、content)のインデックスは、リコールを制御します。別名、返されるもの。
2つの別々のインデックス(1つはキーワードのみ、もう1つはコンテンツのみ)は、関連性を制御します。また、ここで独自の重み付け基準を適用できます。
任意の数の異なるインデックスを使用できることに注意してください(または、他の要因に基づいてクエリ時に使用するインデックスと重み付けを変更する可能性があります...クエリにストップワードが含まれている場合にのみキーワードを検索します...クエリに3つ以上の単語が含まれている場合はキーワード...など)
各インデックスはディスクスペースを消費するため、より多くのインデックス、より多くのディスクが使用されます。そして今度は、mysqlのメモリフットプリントが高くなります。また、更新するインデックスが多いため、挿入に時間がかかります。
状況に応じて、パフォーマンスをベンチマークする必要があります(ベンチマークのために、mysqlクエリキャッシュをオフにするように注意してください。オフにしないと、結果が歪んでしまいます)。これはグーグルグレードの効率ではありませんが、非常に簡単で「すぐに使える」ものであり、クエリで「いいね」を使用するよりもはるかに優れていることはほぼ間違いありません。
本当にうまくいくと思います。