私のプレゼンテーションをチェックしてください
比較しました:
-
LIKE
述語 - 正規表現
述語(
LIKE
よりも優れている ) - MyISAM 全文 インデックス作成
- スフィンクス検索
- Apache Lucene
- 転置インデックス
- Google カスタム検索エンジン
今日使用するのは
あなたのコメントを再確認してください:ああ、大丈夫、いいえ。私が言及した全文検索機能はいずれも、ある種の単語境界を想定しているため、役に立ちません。
任意の部分文字列を効率的に見つけるもう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%';