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

MySQLでの全文検索:良い点、悪い点、醜い点

    MySQLデータベースを検索するときに、文字ベースのデータに対して全文検索クエリを実行したい場合があります。今日は、このような検索方法の長所と短所について説明します。

    MySQLの全文検索とは何ですか?

    全文検索は、検索条件に完全に一致しない可能性のあるレコードを検索できるようにする手法です。 MySQLでの全文検索は、特定のインデックスが使用されているときに実行され、それらのインデックスには次のような多くの固有のニュアンスがあります。

    • インデックスがフルテキストインデックスと見なされるためには、インデックスがフルテキストタイプである必要があります。
    • FULLTEXTインデックスは、InnoDBまたはMyISAMストレージエンジンを実行しているテーブルでのみ使用できます。
    • FULLTEXTインデックスは、CHAR、VARCHAR、またはTEXT列に対してのみ作成できます。
    • FULLTEXTインデックスは、MATCH()AGAINST()句が使用されている場合にのみ使用されます。
    • 全文検索には、自然言語モード、ブールモード、クエリ拡張モードの3つのモードがあります。

    FULLTEXTインデックスは、値をインデックス内の値と比較する代わりに、テキスト内のキーワードを検索する特殊なタイプのインデックスです。全文検索は他のタイプのマッチングとは異なりますが、同じ列にBTREEインデックスとFULLTEXTインデックスを同時に持つことができることに注意してください。これらは異なる目的に適しているため、競合することはありません。

    全文検索タイプ

    MySQLで全文検索を実行する場合は、次の3つの検索タイプから選択できることに注意してください。

    1. 自然言語の検索タイプ-このような検索モードは、検索文字列をリテラルフレーズとして解釈します。修飾子が指定されていない場合、またはIN NATURAL LANGUAGE MODE修飾子が指定されている場合、デフォルトで有効になります。
    2. クエリ拡張検索タイプ-このような検索モードでは、検索が2回実行されます。 2回目の検索の場合、結果セットには、最初の検索で最も関連性の高いドキュメントがいくつか含まれます。 WITHQUERYEXPANSION修飾子を使用して有効にします;
    3. ブール検索タイプ-このような検索モードでは、より小さい( "<")およびより大きい( ">")演算子、部分式( "( ”および“)”)、プラス(+)記号、マイナス(-)記号、二重引用符(“”)、結果への値の寄与を下げる演算子(〜)、およびワイルドカード演算子(*)-ワイルドカード演算子を使用すると、ファジーマッチングで検索できます(たとえば、「デモ*」は「デモンストレーション」にも一致します)。 INBOOLEANMODE修飾子を使用して有効にします。
    自然言語検索モードでの全文検索

    上記の自然言語検索モードは、デフォルトで、またはIN NATURALLANGUAGEMODE修飾子が指定されている場合に有効になります。このモードは、特定のテキストコレクション(1つ以上の列)に対して自然言語検索を実行します。 MySQLでの全文検索の基本的なクエリ形式は、次のようになります。

    SELECT * FROM table WHERE MATCH(column) AGAINST(“string” IN NATURAL LANGUAGE MODE);

    MATCH()をWHERE句と一緒に使用すると、行は最も関連性の高いものから順に自動的に並べ替えられます。正確な文字列を検索するには、二重引用符で囲みます。

    クエリ拡張モードを使用したフルテキスト検索

    フルテキスト検索では、クエリ拡張モードもサポートされています。このような検索モードは、ユーザーが暗黙の知識に依存している場合に頻繁に使用されます。たとえば、ユーザーは検索結果に「MongoDB」と「MySQL」の両方が表示されることを期待して「DBMS」を検索する場合があります。このような検索モードを使用するときにユーザーが暗黙の知識に頼ることができる理由は非常に単純です。クエリ拡張モードを使用した全文検索は、検索を2回実行することで機能します。2番目の検索フレーズは最初の検索フレーズです。最初の検索からのいくつかの最も関連性の高いエントリと連結されます。つまり、たとえば、最初の検索で行の1つに「DBMS」という単語と「MySQL」という単語が含まれている場合、2番目の検索では「MySQL」という単語が含まれていないエントリが検索されます。 「DBMS」が含まれています。クエリ拡張モードを使用するクエリ形式は次のようになります。

    SELECT * FROM table WHERE MATCH(column) AGAINST(“string” WITH QUERY EXPANSION); 
    ブールモードを使用した全文検索

    ブールモードは、MySQL全文検索が提供する最も興味深いものの1つです。このモードでは、ブール演算子を使用して検索機能を拡張できるため、このモードに固有の多くの注意事項があります。ブールモードが使用されている場合、特定の文字は単語の最初または最後に特別な意味を持つことがあります。例:

    • 「+」はANDを意味します;
    • 「-」はNOTを意味します;
    • 「(」および「)」演算子を使用すると、部分式を作成できます。
    • “ <”および“>”演算子は、検索値のランクを上下に変更します。
    • 「〜」は、検索結果への値の貢献度を下げます。
    • 二重引用符(“”)はリテラル値にのみ一致します;
    • 「*」はワイルドカード演算子です(上記の説明を参照してください)。

    これらの演算子を使用すると、検索の機能を拡張できます。たとえば、「Demo2」ではなく「Demo」という単語を含むすべての行を取得する場合は、クエリを使用できます。そのように:

    SELECT * FROM table WHERE MATCH(column) AGAINST (“+Demo -Demo2” IN BOOLEAN MODE);

    次のように、二重引用符を一重引用符と一緒に使用することもできます。

    SELECT * FROM table WHERE MATCH(column) AGAINST(‘“search string”’ IN BOOLEAN MODE);
    全文検索の落とし穴

    MySQLで全文検索を使用する前に、検索にはいくつかの「落とし穴」があることに注意してください。

    • InnoDBとMyISAMの両方のストレージエンジンには、独自のストップワードのリストがあります。 InnoDBストップワードリストはここにあり、MyISAMストップワードリストはここにあります。
      • InnoDBの独自のストップワードリストを定義するには、INNODB_FT_DEFAULT_STOPWORDテーブルと同じ構造のテーブルを定義し、そこにストップワードを挿入してから、innodb_ft_server_stopword_tableオプションの値をdb_name/table_nameの形式で設定します。
      • MyISAMの独自のストップワードリストを定義するには、ft_stopword_file変数をストップワードリストを含むファイルのパス名に設定します。ファイル内のストップワードは、「_」と「‘」を除く任意の非英数字で区切ることができます。デフォルトのストップワードファイルは、storage / myisam/ft_static.cにあります。ストップワードは、変数を空の文字列に設定することで無効にできます。
    • フルテキスト検索はパーティションテーブルではサポートされていません。
    • FULLTEXTインデックスのすべての列は、同じ文字セットと照合を使用する必要があります。
    • 全文検索操作では、%文字列はワイルドカードとして扱われません。

    もう1つの注意点があります。組み込みのフルテキストパーサーは、スペース( "")、コンマ( "、 ”)およびピリオド(“。”)は、検索文字列にこれらの文字が1つ以上含まれている場合、検索結果が正確でない可能性があることを意味します。たとえば、データベースに文字列「test.demo」を含む5行が含まれている場合、検索クエリ「test.demo」は「demo」、「string.demo_example」などを含むより多くの(10、15など)結果を返す可能性があります。 「test.demo」ではなく「demo」が検索されるため、無関係な一致が多数発生する可能性があります。 MySQLは、CまたはC ++で独自のプラグインを作成する場合(MySQLのドキュメントを参照)、この問題の回避策を提供しますが、それまでは多くのことを行うことはできません。

    MySQLの全文制限の完全なリストは、MySQLのドキュメントページで確認できます。

    概要

    MySQL全文検索機能は、MySQLを実行しているアプリケーションにさまざまな検索手法(自然言語検索、クエリ拡張検索、ブール検索)を実装する簡単な方法を提供します。これらの検索手法にはそれぞれ独自の注意事項があり、それぞれがさまざまな目的に適している可能性があります。全文検索を使用するかどうかを決定するときは、このタイプの検索にはそれ自体に固有の多くの微妙な点があることに注意してください。 MySQLで全文検索を利用し、賢明に選択することの欠点。


    1. MariaDB JSON_DEPTH()の説明

    2. MySQLデータベースに接続する方法は?

    3. OracleのJSON_OBJECTAGG()関数

    4. MySQLおよびGROUP_CONCAT()の最大長