Filtering Explained
Zilliz Cloud は、データを精密にクエリできる強力なフィルタリング機能を提供します。フィルター式を使うと、特定のスカラーフィールドを対象に、さまざまな条件で検索結果を絞り込めます。このガイドでは、Zilliz Cloud クラスターでのフィルター式の使い方を、クエリ操作を中心とした例とともに説明します。これらのフィルターは検索リクエストや削除リクエストにも適用できます。
基本演算子
Zilliz Cloud は、データフィルタリング用の複数の基本演算子をサポートしています。
-
比較演算子:
==、!=、>、<、>=、<=を使用すると、数値フィールドまたはテキストフィールドに基づいてフィルタリングできます。 -
範囲・パターンフィルター:
IN、LIKE、=~、!~は、値、ワイルドカードパターン、正規表現パターンとの一致判定を行います。文字列パターンの詳細については、Pattern Matching を参照してください。 -
算術演算子:
+、-、*、/、%、**は、数値フィールドを含む計算に使用されます。 -
ビット演算子: 以降のバージョンでは、
&、|、^を使用して、権限やステータスビットなど複数のフラグをエンコードした整数フィールドをフィルタリングできます。詳細については、Basic Operators を参照してください。 -
論理演算子:
AND、OR、NOTを使用すると、複数の条件を組み合わせて複雑な式を作成できます。 -
IS NULL / IS NOT NULL 演算子:
IS NULLおよびIS NOT NULL演算子は、フィールドが null 値(データの欠如)を含むかどうかを基準にフィルタリングします。詳細については、Basic Operators を参照してください。
例: 色によるフィルタリング
スカラーフィールド color で原色(赤、緑、青)を持つエンティティを検索するには、次のフィルター式を使用します。
filter='color in ["red", "green", "blue"]'
例: 権限ビットによるフィルタリング
整数型の permissions フィールドで SHARE ビットが立っているエンティティを検索するには、ビット単位の AND 演算子(&)を使用します。
filter='(permissions & 4) == 4'
例: 正規表現パターンによるフィルタリング
message フィールドに E1001 などのエラーコードが含まれるエンティティを検索するには、正規表現マッチ演算子 =~ を使用します。
filter='message =~ "E[0-9]{4}"'
正規表現フィルターは部分文字列マッチを行います。フィールド値全体をパターンに一致させたい場合は、^ と $ のアンカーを追加してください。詳細については、Pattern Matching を参照してください。
例: JSON フィールドのフィルタリング
Zilliz Cloud では、JSON フィールド内のキーを参照できます。たとえば、キー price と model を持つ JSON フィールド product があり、特定のモデルかつ価格が 1,850 未満の製品を検索する場合は、次のフィルター式を使用します。
filter='product["model"] == "JSN-087" AND product["price"] < 1850'
例: 配列フィールドのフィルタリング
2000 年以降に観測所で記録された平均気温のレコードを含む配列フィールド history_temperatures があり、2009 年(10 番目のレコード)の気温が 23°C を超える観測所を検索する場合は、次の式を使用します。
filter='history_temperatures[10] > 23'
これらの基本演算子の詳細については、Basic Operators を参照してください。
フィルター式テンプレート
CJK 文字でフィルタリングする場合、文字セットが大きくエンコーディングも異なるため、処理が複雑になることがあります。特に IN 演算子を使用する際にパフォーマンスが低下する可能性があります。
Zilliz Cloud は、CJK 文字を扱う際のパフォーマンスを最適化するため、フィルター式テンプレートを導入しています。動的な値をフィルター式から分離することで、クエリエンジンがパラメーターの挿入をより効率的に処理できます。
"北京"(北京)または "上海"(上海)に住む 25 歳以上の人を検索するには、次のテンプレート式を使用します。
filter = "age > 25 AND city IN ['北京', '上海']"
パフォーマンスを向上させるには、パラメーターを使用した以下のバリエーションを利用します。
filter = "age > {age} AND city in {city}",
filter_params = {"age": 25, "city": ["北京", "上海"]}
この方法により解析オーバーヘッドが削減され、クエリ速度が向上します。詳細については、Filter Templating を参照してください。
データ型固有の演算子
Zilliz Cloud は、JSON、ARRAY、VARCHAR フィールドなど特定のデータ型向けに高度なフィルタリング演算子を提供します。
JSON フィールド固有の演算子
Zilliz Cloud は、JSON フィールドのクエリに使える高度な演算子を提供し、複雑な JSON 構造内でも精密なフィルタリングが可能です。
JSON_CONTAINS(identifier, jsonExpr): JSON 式がフィールド内に存在するかを確認します。
# JSON data: {"tags": ["electronics", "sale", "new"]}
filter='json_contains(tags, "sale")'
JSON_CONTAINS_ALL(identifier, jsonExpr): JSON 式のすべての要素が存在することを確認します。
# JSON data: {"tags": ["electronics", "sale", "new", "discount"]}
filter='json_contains_all(tags, ["electronics", "sale", "new"])'
JSON_CONTAINS_ANY(identifier, jsonExpr): JSON 式の要素が少なくとも 1 つ存在するエンティティをフィルタリングします。
# JSON data: {"tags": ["electronics", "sale", "new"]}
filter='json_contains_any(tags, ["electronics", "new", "clearance"])'
JSON 演算子の詳細については、JSON Operators を参照してください。
ARRAY フィールド固有の演算子
Zilliz Cloud は、ARRAY_CONTAINS、ARRAY_CONTAINS_ALL、ARRAY_CONTAINS_ANY、ARRAY_LENGTH など、配列フィールド向けの高度なフィルタリング演算子を提供し、配列データをきめ細かく制御できます。
ARRAY_CONTAINS: 特定の要素を含むエンティティをフィルタリングします。
filter="ARRAY_CONTAINS(history_temperatures, 23)"
ARRAY_CONTAINS_ALL: リスト内のすべての要素が存在するエンティティをフィルタリングします。
filter="ARRAY_CONTAINS_ALL(history_temperatures, [23, 24])"
ARRAY_CONTAINS_ANY: リストのいずれかの要素を含むエンティティをフィルタリングします。
filter="ARRAY_CONTAINS_ANY(history_temperatures, [23, 24])"
ARRAY_LENGTH: 配列の長さに基づいてフィルタリングします。
filter="ARRAY_LENGTH(history_temperatures) < 10"
配列演算子の詳細については、ARRAY Operators を参照してください。
VARCHAR フィールド固有の演算子
Zilliz Cloud は、VARCHAR フィールドで精密なテキスト検索を行うための専用演算子を提供します。
パターンマッチング演算子
LIKE、=~、!~ 演算子は、VARCHAR フィールド、JSON の文字列パス、および特定の ARRAY<VARCHAR> 要素に対して文字列パターンのマッチングを行います。単純なワイルドカードパターンには LIKE を、RE2 正規表現には =~ と !~ を使用します。
詳細については、Pattern Matching を参照してください。
TEXT_MATCH 演算子
TEXT_MATCH 演算子を使用すると、特定のクエリ語句に基づいてドキュメントを正確に取得できます。スカラーフィルターとベクトル類似性検索を組み合わせたフィルタリング検索に特に有効です。セマンティック検索とは異なり、Text Match は語句の完全一致に焦点を当てます。
Zilliz Cloud は Tantivy を用いて転置インデックスと語句ベースのテキスト検索をサポートしています。処理の流れは以下のとおりです。
-
Analyzer: 入力テキストをトークン化して処理します。
-
Indexing: ユニークなトークンをドキュメントにマッピングする転置インデックスを作成します。
詳細については、Text Match を参照してください。
PHRASE_MATCH operator
PHRASE_MATCH operator を使用すると、クエリ語の順序と隣接性を考慮した完全一致フレーズに基づき、ドキュメントを正確に取得できます。
詳細については、Phrase Match を参照してください。