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

SQLで部分文字列検索を実装するための最良の方法は何ですか?

    私のプレゼンテーションをチェックしてくださいMySQLでの実用的な全文検索 。

    比較しました:

    今日使用するのは ApacheSolr です。 、これにより、Luceneは多数の追加機能とツールを備えたサービスになります。

    あなたのコメントを再確認してください:ああ、大丈夫、いいえ。私が言及した全文検索機能はいずれも、ある種の単語境界を想定しているため、役に立ちません。

    任意の部分文字列を効率的に見つけるもう1つの方法は、N-gram です。 アプローチ。基本的に、N文字のすべての可能なシーケンスのインデックスを作成し、それぞれのシーケンスが発生する文字列をポイントします。通常、これはN =3、またはトリグラム を使用して行われます。 、これは、長い部分文字列を照合することと、インデックスを管理可能なサイズに保つことの間の妥協点であるためです。

    N-gramインデックスを透過的にサポートするSQLデータベースはありませんが、転置インデックスを使用して自分で設定できます。 :

    create table trigrams (
      trigram char(3) primary key
    );
    
    create table trigram_matches (
      trigram char(3),
      document_id int,
      primary key (trigram, document_id),
      foreign key (trigram) references trigrams(trigram),
      foreign key (document_id) references mytable(document_id)
    );
    

    今度は難しい方法でそれを投入します:

    insert into trigram_matches
      select t.trigram, d.document_id
      from trigrams t join mytable d
        on d.textcolumn like concat('%', t.trigram, '%');
    

    もちろん、これにはかなり時間がかかります!ただし、完了すると、はるかにすばやく検索できます。

    select d.*
    from mytable d join trigram_matches t
      on t.document_id = d.document_id
    where t.trigram = 'abc'
    

    もちろん、3文字より長いパターンを検索することもできますが、転置インデックスは検索を大幅に絞り込むのに役立ちます。

    select d.*
    from mytable d join trigram_matches t
      on t.document_id = d.document_id
    where t.trigram = 'abc'
      and d.textcolumn like '%abcdef%';
    


    1. 一括読み込みできません。オペレーティングシステムのエラーコード5(アクセスが拒否されました。)

    2. PreparedStatementのエラー

    3. SQLServerにUpdateストアドプロシージャを挿入します

    4. MySQLでmax_connectionsをプログラムで設定する方法