sql >> データベース >  >> RDS >> Mysql

MySQL全文検索の関連性を操作して、あるフィールドを別のフィールドよりも「価値のある」ものにするにはどうすればよいですか?

    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クエリキャッシュをオフにするように注意してください。オフにしないと、結果が歪んでしまいます)。これはグーグルグレードの効率ではありませんが、非常に簡単で「すぐに使える」ものであり、クエリで「いいね」を使用するよりもはるかに優れていることはほぼ間違いありません。

    本当にうまくいくと思います。



    1. SQLServerで実行されているクエリを一覧表示します

    2. CASCADE DELETEを有効にするためにテーブルを編集するにはどうすればよいですか?

    3. 関数を使用して2つの日付の間の日付のリストを取得します

    4. アプリケーションが起動するたびにリソースIDが変更されますか