ホームページ > データベース > mysql チュートリアル > 複数の列にわたる MySQL 全文検索で関連性に優先順位を付けるにはどうすればよいですか?

複数の列にわたる MySQL 全文検索で関連性に優先順位を付けるにはどうすればよいですか?

DDD
リリース: 2024-12-01 03:59:13
オリジナル
987 人が閲覧しました

How Can I Prioritize Relevance in MySQL Full Text Search Across Multiple Columns?

MySQL 全文検索: 関連性と列の優先順位付けの最適化

複数のテーブル列にわたって全文検索を実行する場合、多くの場合、関連性による結果。 MySQL の MATCH() AGAINST() 関数は、これを達成する効率的な方法を提供します。

ただし、特定の列内の関連性を優先することが重要な状況が発生します。たとえば、head 列と body 列を持つページを含むテーブルがあり、head 列で見つかった一致に高い優先順位を与えたいとします。

解決策: 列固有の関連性を組み込む

この要件に対処するには、追加の MATCH() 句を利用して、先頭列の関連性を個別に計算できます。これを全体的な関連性と組み合わせることで、全体的な検索条件と指定された列の両方に一致する結果に優先順位を付けることができます。

SELECT pages.*,
       MATCH(head, body) AGAINST('some words') AS relevance,
       MATCH(head) AGAINST('some words') AS head_relevance
FROM pages
WHERE MATCH(head, body) AGAINST('some words')
ORDER BY head_relevance DESC, relevance DESC
ログイン後にコピー

このクエリでは、全体的な関連性 (関連性) と先頭列の両方を計算します。特定の関連性 (head_relevance)。最初に head_relevance によって降順 (DESC) で結果を並べ替え、次に関連性によっても降順で並べ替えることで、head 列で見つかった一致に効果的に優先順位を付けます。

ボーナス: 検索語の出現数のカウント

上記のアプローチは列の優先順位付けを強化しますが、検索の発生回数は提供しません。指定された列内の用語。これを実現するには、FULLTEXT() 関数と LENGTH() 関数を使用します。

...
SELECT pages.*,
       MATCH(head, body) AGAINST('some words') AS relevance,
       MATCH(head) AGAINST('some words') AS head_relevance,
       LENGTH(head) - LENGTH(REPLACE(head, 'some words', '')) AS head_count,
       LENGTH(body) - LENGTH(REPLACE(body, 'some words', '')) AS body_count
FROM pages
...
ログイン後にコピー

これは、前のクエリを拡張して、見出し (head_count) と本文 (body_count) の両方内の検索語の出現数を計算します。 columns.

追加オプション: Postgres と重み付け

プロジェクトに適している場合、Postgres は関連性ランキングをより細かく制御できる高度な機能を提供します。その検索機能は、特定の用語や演算子の重み付けをサポートしており、検索結果をより詳細にカスタマイズできます。

以上が複数の列にわたる MySQL 全文検索で関連性に優先順位を付けるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート