私は仲間の開発者とよりよくコミュニケーションをとるためにボキャブラリーを磨こうとしています。文字列'running%'
の先頭から'%running%
のどこかを検索する必要があるかどうかについて、サイト内のいくつかの場所で議論しています。
私はミドル検索 "fuzzy"と呼んでいますが、ファジィは単語の形式を「run」、「runing」に変更することを意味するため、正しくありません[ sic]、「runed」[sic]。
文字列の先頭を検索し、文字列の中央を検索するための正しい用語は何ですか?
これは「アンカーされていない検索パターン」と呼ばれ、SQLでは次のようになります。
_foo LIKE '%bar%'
_
どちらかの側に_%
_がない場合、検索パターンがそれぞれ文字列の先頭または末尾にアンカーすると言われています。この用語は正規表現の世界に由来します。
_foo LIKE 'bar%'
_
"検索パターン_bar%
_が文字列の先頭に固定されている"と言うでしょう。
比較のため、PCREは_^
_または_$
_トークンで固定されており、_^bar
_または_bar$
_のように見えます。 PCREはトークンによる明示的なアンカーを必要としますが、SQL LIKE
ステートメントは暗黙的にアンカーされ、「アンカーされていない検索パターン」を作成するには明示的な_%
_が必要です。
補足として、これらのタイプの式にトライグラムでインデックスを付けることができます _pg_trgm
_ in PostgreSQL
最初に頭に浮かぶのは、「un - Sargable 」です。インデックス付きフィールドで特定の文字列または文字列の最初の部分を検索すると、シークできます。検索がワイルドカードで始まる場合、RDBMSはインデックス全体をスキャンする必要があります。これは、検索述語に一致する値が値のセットのどこにでも現れる可能性があるためです。
電話帳を見ることを検討してください(あなたがそれらを覚えるのに十分古い場合...)。姓が「Dan」で始まる人を簡単に見つけることができます。親指をDに向けると、DAに早送りすると、DANのものがすべて一緒になります。姓に文字列「ANIEL」が含まれている人を検索する場合は、すべてのページを読み取る必要があります(表をスキャンしてください)。
それはあなたの質問ではありませんが、ファジーの例は不正確です。
'run'
のファジー検索には、「ran」が含まれます、「ルード」、および他の多くの単語。 SQLはファジー検索をサポートしていません。Luceneのような追加のシステムが必要です。'run%'
には常に「runing」と「runed」が含まれ、で始まるおよびcontains('%run%'
to include 'outrunning')as @ Solomon Rutzky が示唆するように' run '
(または' run% '
toを指定する必要があります。 「bla bla runing bla」や「bla runed bla bla」などの部分一致を含めます。