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


19

仲間の開発者とのコミュニケーションを改善するために、語彙を磨き上げようとしています。'running%'文字列内のどこからでも最初から文字列を検索する必要があるかどうかを議論しているサイトには、いくつかの場所があります'%running%

ファジーとは「run」、「runing」[sic]、「runed」[sic]という単語の形式を変更することを意味するため、中間検索を「ファジー」と呼んでいます。

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


1
私はこれらの2つのオプションを区別するために、「次で始まる」と「含む」を使用する場所で働いてきました。
ソロモンラッツキー

回答:


24

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

foo LIKE '%bar%'

%どちらか一方に欠けている場合、検索パターンそれぞれ文字列の先頭または末尾に固定されると言われています。この専門用語は、正規表現の世界から来ています。

foo LIKE 'bar%'

bar%文字列の先頭に固定された検索パターン」と言うでしょう。

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

補足として、PostgreSQLのようなものを使用して、これらのタイプの式にトライグラムをインデックス付けできpg_trgmます


1

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

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


2
「RDBMSはインデックス全体をスキャンする必要があります」というのは事実ではありません。postgresql.org/docs/9.6/static/pgtrgm.html
エヴァンキャロル

unsargableは、他の多くのケース(たとえば、列で実行された関数の結果を検索する)をカバーするため、ここで探しているよりも一般的な用語だと思います。
デビッドスピレット

0

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

  • ファジーはシャープなバイナリの反対です。たとえば、'run'精度0.5でのファジー検索には「ran」、「rud」、その他多くの単語が含まれます。SQLはファジー検索をサポートしていませ。Luceneなどの追加システムが必要です。
  • ワイルドカードの検索意志'run%'常に「runingて」と「ルーン文字が刻ま」を含むだろう、とあなたが区別できるから始まる含まれている'%run%'@として「outrunning」を含むため)ソロモンRutzkyが示唆
  • ただし、たとえばテキストブロックで単語全体を検索する場合は、先行または後続の空白を示す必要があります' run '(または' run% '「bla bla runing bla」や「bla runed bla bla」などの部分一致を含める必要があります)。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.