web-dev-qa-db-ja.com

文字列の最初ではなく中央を検索するとき、それは何と呼ばれますか?

私は仲間の開発者とよりよくコミュニケーションをとるためにボキャブラリーを磨こうとしています。文字列'running%'の先頭から'%running%のどこかを検索する必要があるかどうかについて、サイト内のいくつかの場所で議論しています。

私はミドル検索 "fuzzy"と呼んでいますが、ファジィは単語の形式を「run」、「runing」に変更することを意味するため、正しくありません[ sic]、「runed」[sic]。

文字列の先頭を検索し、文字列の中央を検索するための正しい用語は何ですか?

19
danielson317

これは「アンカーされていない検索パターン」と呼ばれ、SQLでは次のようになります。

_foo LIKE '%bar%'
_

どちらかの側に_%_がない場合、検索パターンがそれぞれ文字列の先頭または末尾にアンカーすると言われています。この用語は正規表現の世界に由来します。

_foo LIKE 'bar%'
_

"検索パターン_bar%_が文字列の先頭に固定されている"と言うでしょう。

比較のため、PCREは_^_または_$_トークンで固定されており、_^bar_または_bar$_のように見えます。 PCREはトークンによる明示的なアンカーを必要としますが、SQL LIKEステートメントは暗黙的にアンカーされ、「アンカーされていない検索パターン」を作成するには明示的な_%_が必要です。

補足として、これらのタイプの式にトライグラムでインデックスを付けることができます _pg_trgm_ in PostgreSQL

24
Evan Carroll

最初に頭に浮かぶのは、「un - Sargable 」です。インデックス付きフィールドで特定の文字列または文字列の最初の部分を検索すると、シークできます。検索がワイルドカードで始まる場合、RDBMSはインデックス全体をスキャンする必要があります。これは、検索述語に一致する値が値のセットのどこにでも現れる可能性があるためです。

電話帳を見ることを検討してください(あなたがそれらを覚えるのに十分古い場合...)。姓が「Dan」で始まる人を簡単に見つけることができます。親指をDに向けると、DAに早送りすると、DANのものがすべて一緒になります。姓に文字列「ANIEL」が含まれている人を検索する場合は、すべてのページを読み取る必要があります(表をスキャンしてください)。

1

それはあなたの質問ではありませんが、ファジーの例は不正確です。

  • ファジーはsharp、binaryの反対です。つまり、一致のパーセンテージを持つことができます。たとえば、精度.5での'run'のファジー検索には、「ran」が含まれます、「ルード」、および他の多くの単語。 SQLはファジー検索をサポートしていません。Luceneのような追加のシステムが必要です。
  • wildcardsearch will 'run%'には常に「runing」と「runed」が含まれ、で始まるおよびcontains'%run%' to include 'outrunning')as @ Solomon Rutzky が示唆するように
  • ただし、たとえばテキストブロック内の単語全体を検索する場合は、前後の空白' run '(または' run% ' toを指定する必要があります。 「bla bla runing bla」や「bla runed bla bla」などの部分一致を含めます。
0
Damian Vogel