メインコンテンツまでスキップ

パターンマッチング

エージェント型検索アプリケーションでは、ベクトル検索と grep 形式のパターンマッチングが互いを補完することがよくあります。ベクトル検索は意味的に関連するエンティティを取得し、パターンマッチングはエラーコード、ログのプレフィックス、メールドメイン、URL パス、識別子など、正確な文字列構造によってその結果を絞り込みます。

Zilliz Cloud では、これらのパターン制約をスカラーフィルターで表現できます。単純なワイルドカードマッチングには LIKE を、RE2 正規表現には =~ または !~ を使用します。これらのフィルターは、query、search、ハイブリッド検索と組み合わせることができます。

Note

このページでは、query、search、ハイブリッド検索で使用されるスカラーフィルター式のパターンマッチングについて説明します。これらの式はフィールド値を評価するものであり、アナライザーが生成するトークンを変更するものではありません。テキスト分析中にトークンをフィルタリングするには、Regex Analyzer Filter を参照してください。

パターンマッチング式は filter パラメーターに記述します。たとえば、次のクエリは E1001 などのエラーコードを含むログメッセージに一致します。

python
from pymilvus import MilvusClient

client = MilvusClient(uri="YOUR_CLUSTER_ENDPOINT")

res = client.query(
collection_name="log_events",
filter='message =~ "E[0-9]{4}"',
output_fields=["message", "severity"],
)

このページの例では、filter に割り当てる式に焦点を当てています。query、search、ハイブリッド検索など、スカラーフィルターを受け付ける Zilliz Cloud の操作では、同じフィルター式構文を使用できます。

Notes

フィルター式の左辺のリテラルには、以下の例で使用する message、email などのコレクションフィールド名、または filter = 'struct[0][subfield] =~ "E[0-9]{4}"' のように特定の要素インデックスにある StructArray サブフィールドの名前を指定できます。

StructArray フィールドでのスカラーフィルタリングの詳細については、StructArray Operators を参照してください。

サポートされるフィールドタイプ​

パターンマッチングは文字列値で使用できます。

対象LIKE正規表現 =~ / !~備考
VARCHAR フィールドはいはい文字列フィールドのパターンマッチングの一般的な対象です。
VARCHAR キャスト型の JSON パスはいはい一致を返すには、JSON パスの値が文字列である必要があります。高速化のために JSON パスにインデックスを作成する場合は、json_cast_type="varchar" を設定します。
ARRAY<VARCHAR> 要素はいはいtags[0] など、インデックスで特定の要素を一致させます。パターンマッチングはすべての要素をスキャンしません。指定したインデックスの要素にのみ適用されます。
数値、Boolean、ベクトル、TEXT、またはその他の VARCHAR 以外の対象いいえいいえパターンマッチングは、VARCHAR 値、文字列に解決される JSON パス、またはインデックス付きの ARRAY<VARCHAR> 要素でのみ使用できます。

LIKE または正規表現を選択する​

必要なパターンを表現する最も単純な演算子を選択してください。

文字列の完全一致が必要な場合は、パターンマッチングではなく == を使用することをお勧めします。LIKE または正規表現は、フィルターでパターンを一致させる必要がある場合にのみ使用してください。

要件推奨される演算子例説明
文字列の完全一致==status == "active"文字列 active の完全一致です。
単純なプレフィックス一致LIKEname LIKE "Prod%"Prod で始まる文字列に一致します。
単純なサフィックス一致LIKEfilename LIKE "%.json".json で終わる文字列に一致します。
単純な含有一致LIKEdescription LIKE "%vector database%"文字列内の任意の場所に vector database を含む値に一致します。
構造化されたコードまたは固定長パターンに一致させる=&#126;code =&#126; "E[0-9]{4}"E の後に 4 桁の数字が続く文字列に、大文字と小文字を区別して一致します(例: E1001)。
大文字と小文字を区別しないパターンマッチング(?i) を指定した =&#126;message =&#126; "(?i)error"error、ERROR、その他の大文字と小文字のバリエーションに一致します。
正規表現パターンに一致する値を除外する!&#126;message !&#126; "^DEBUG"DEBUG で始まる文字列を除外します。

単純なワイルドカードマッチングには LIKE を使用します。文字クラス、繰り返し、error|failed などの選択、アンカー、または大文字と小文字を区別しない一致がパターンに必要な場合は、正規表現を使用します。

LIKE を使用する​

LIKE 演算子は、文字列値の単純なワイルドカードマッチングに使用します。サポートされるワイルドカードは次のとおりです。

ワイルドカード説明
%0 文字以上の文字に一致します。
_正確に 1 文字に一致します。

一般的な LIKE パターン​

% と _ の位置を使用して、一致する文字列内で固定テキストが表示される場所を制御します。

要件パターンフィルターの例
プレフィックスで始まるProd%filter = 'name LIKE "Prod%"'
サフィックスで終わる%.jsonfilter = 'filename LIKE "%.json"'
部分文字列を含む%vector%filter = 'description LIKE "%vector%"'
固定位置の 1 文字に一致するAB_%filter = 'code LIKE "AB_%"'

LIKE の一致動作​

プレフィックス、サフィックス、含有、固定位置の単一文字の一致には LIKE を使用します。LIKE は、[0-9] などの文字クラス、error|failed などの選択、{4} などの繰り返し回数、^ や $ などのアンカー、(?i) などの大文字と小文字を区別しないフラグをサポートしていません。これらのパターンには正規表現を使用してください。

文字列全体の完全一致には == を使用します。LIKE は、フィルターでワイルドカードマッチングが必要な場合にのみ使用してください。

LIKE パターンでワイルドカードをエスケープする​

LIKE パターンでは、% は任意の数の文字に一致し、_ は 1 文字に一致します。%、_、\ をリテラルとして一致させるには、バックスラッシュ(\)で文字をエスケープします。

  • name LIKE r"\%" は、リテラル値 % に一致します。

  • name LIKE r"\_%" は、リテラル _ で始まる値に一致します。

  • name LIKE r"\\%" は、リテラルのバックスラッシュで始まる値に一致します。

r"..." または r'...' と記述する生文字列リテラルは、Zilliz Cloud のフィルター式でバックスラッシュをそのまま保持します。バックスラッシュを含む LIKE および正規表現パターンには、生文字列リテラルを使用することをお勧めします。生文字列を使用しない場合、通常の文字列リテラルはパターンが評価される前にエスケープシーケンスを処理するため、より多くのバックスラッシュが必要になることがあります。

正規表現を使用する | PUBLIC​

文字クラス、繰り返し、選択、アンカー、大文字と小文字を区別しない一致などの正規表現機能がパターンに必要な場合は、正規表現フィルターを使用します。Zilliz Cloud は、文字列値に RE2 正規表現を適用します。

=~ または !~ の右辺は、文字列リテラルである必要があります。

演算子意味例
=&#126;正規表現パターンを満たす値に一致します。filter = 'message =&#126; "E[0-9]{4}"'
!&#126;正規表現パターンを満たす値を除外します。filter = 'message !&#126; "^DEBUG"'

生文字列リテラルを使用する​

バックスラッシュを含む正規表現パターンには、生文字列リテラルを使用することをお勧めします。r"..." または r'...' と記述する生文字列では、バックスラッシュが正規表現エンジンにそのまま渡されます。これにより、通常の文字列リテラルで必要になる追加のエスケープを回避できます。

次に例を示します。

python
filter = 'message =~ r"\d{4}-\d{2}-\d{2}"'

これは、2026-07-01 などの日付のような値を含む文字列に一致します。

生文字列を使用しない場合、通常の文字列リテラルは正規表現パターンが評価される前にエスケープシーケンスを処理するため、\d、\s、エスケープされたリテラル文字などのパターンには追加のバックスラッシュが必要になることがあります。

一般的な正規表現パターン​

次の例では、Zilliz Cloud のフィルター式で一般的な RE2 構文を使用しています。正規表現の完全な構文については、RE2 構文リファレンスを参照してください。

要件パターンフィルターの例
リテラルテキストを含むerrorfilter = 'message =&#126; "error"'
プレフィックスで始まる^ERRfilter = 'code =&#126; "^ERR"'
サフィックスで終わる\.json$filter = 'filename =&#126; "\\.json$"'
数字列に一致する[0-9]+filter = 'message =&#126; "[0-9]+"'
固定桁数の数字に一致する[0-9]{4}filter = 'code =&#126; "[0-9]{4}"'
メールドメインに一致する@example\.com$filter = 'email =&#126; "@example\\.com$"'
大文字と小文字を区別せずに一致する(?i)errorfilter = 'message =&#126; "(?i)error"'
文字列全体に一致する^prod-[0-9]+$filter = 'name =&#126; "^prod-[0-9]+$"'

複数の単語のいずれかに一致させるには、| による選択を使用します。

python
filter = 'message =~ "error|failed|timeout"'

正規表現のメタ文字をリテラルとして一致させる場合は、正規表現パターンでそれらをエスケープします。たとえば、リテラルのドット(正規表現では \.)に一致させるには、Python のフィルター文字列に \\. と記述します。

python
filter = 'email =~ "@gmail\\.com$"'

注記: Zilliz Cloud の正規表現フィルターは RE2 構文に従います。正規表現パターンが RE2 でサポートされていない構文を使用している場合、またはその他の理由で無効な場合、Zilliz Cloud はフィルター式を拒否します。正規表現のメタ文字、フラグ、一致動作の詳細については、RE2 構文リファレンスを参照してください。

一致動作​

部分文字列の一致

Zilliz Cloud の正規表現マッチングは部分文字列のセマンティクスを使用します。パターンはフィールド値全体に一致する必要はありません。たとえば、次のフィルターは E1001 と failed with E1001 after retry の両方に一致します。

python
filter = 'message =~ "E[0-9]{4}"'

フィールド値全体に一致させるには、^ と $ のアンカーを使用します。

python
# Match only values that are exactly E followed by four digits
filter = 'code =~ "^E[0-9]{4}$"'

NULL 許容の VARCHAR フィールド

正規表現フィルターは null 値に一致しません。これは =~ と !~ の両方に適用されます。正規表現パターンを除外しつつ null 値を保持する場合は、OR field IS NULL を明示的に追加します。

python
filter = 'message !~ "^DEBUG" OR message IS NULL'

JSON パス

JSON パスの場合、パスが存在しない、null である、または文字列以外の値に解決されるときは、正規表現フィルターの動作が異なります。

フィルター欠落/null/non-string 値を含みますか?備考
json_field["path"] =&#126; "pattern"いいえ正規表現パターンを満たす文字列値にのみ一致します。
json_field["path"] !&#126; "pattern"はいパスが存在しない、null、文字列以外、または正規表現パターンに一致しない文字列であるエンティティを返します。

インデックスでパターンマッチングを高速化する​

Zilliz Cloud は、VARCHAR フィールドまたは JSON 文字列パスの LIKE および正規表現フィルターと組み合わせて使用できる、NGRAM、STL_SORT、INVERTED、BITMAP などの複数のインデックスタイプを文字列フィールドでサポートしています。パターンマッチングはインデックスなしでも機能しますが、インデックスを使用すると大規模なデータセットでのパフォーマンスを向上できます。

インデックスの有効性は、パターン式、Zilliz Cloud が固定リテラルの部分文字列を抽出できるかどうか、および対象フィールドのカーディナリティと分布によって異なります。name LIKE "Prod%" などのプレフィックス形式のパターンは、description LIKE "%vector%" や filename LIKE "%.json" などのインフィックスまたはサフィックス形式のパターンとは異なるインデックス戦略の恩恵を受ける場合があります。

次の表を出発点として使用し、その後、独自のワークロードでベンチマークしてください。

パターンまたはデータの特性検討するインデックス備考
message =&#126; "error.*timeout" や message LIKE "%database%" など、固定リテラルの部分文字列を含むNGRAMZilliz Cloud がパターンから意味のあるリテラル部分文字列を抽出できる場合に役立ちます。詳細については、NGRAM を参照してください。
プレフィックス、完全一致、等価に近い文字列フィルター。特にカーディナリティが低から中程度のフィールドSTL_SORT、INVERTED、BITMAPフィールドに繰り返し値がある場合、またはフィルターが完全一致に近い場合に、より効果的となることがあります。詳細については、STL_SORT、INVERTED、BITMAP を参照してください。
固定リテラルがない正規表現パターン、または文字クラス、短いトークン、ワイルドカードが中心のパターンインデックスによる高速化に依存する前にベンチマークするこれらのパターンはインデックスの選択性が限られている可能性があり、より広範なスキャンにフォールバックすることがあります。