フィルタリングの説明
Milvusはデータの正確なクエリを可能にする強力なフィルタリング機能を提供します。フィルタ式を使用すると、特定のスカラーフィールドを対象とし、さまざまな条件で検索結果を絞り込むことができます。このガイドでは、Milvusにおけるフィルタ式の使用方法を、クエリ操作に焦点を当てた例を用いて説明します。また、検索や削除のリクエストでもこれらのフィルタを適用することができます。
基本演算子
Milvusはデータをフィルタリングするためのいくつかの基本的な演算子をサポートしています:
比較演算子:
==!=,>,<,>=, および<=では、数値フィールドまたはテキストフィールドに基づくフィルタリングが可能です。範囲フィルタ:
INおよびLIKEは、特定の値の範囲またはセットにマッチさせるのに役立ちます。算術演算子:
+-,*,/,%, および**は、数値フィールドを含む計算に使用されます。論理演算子:
ANDOR、NOTは、複数の条件を組み合わせて複雑な式にします。IS NULL および IS NOT NULL 演算子:
IS NULLおよびIS NOT NULL演算子は、フィールドに NULL 値が含まれているかどうか (データが存在しないかどうか) に基づいてフィールドをフィルタリングするために使用されます。詳細については、「基本演算子」を参照してください。
例色によるフィルタリング
スカラーフィールドcolor で原色(赤、緑、青)を持つエンティティを検索するには、以下のフィルタ式を使用します:
filter='color in ["red", "green", "blue"]'
例JSONフィールドのフィルタリング
MilvusではJSONフィールドのキーを参照することができます。たとえば、price およびmodel をキーとする JSON フィールドproduct があり、特定のモデルで価格が 1,850 より低い製品を検索したい場合は、次のフィルタ式を使用します:
filter='product["model"] == "JSN-087" AND product["price"] < 1850'
例配列フィールドのフィルタリング
2000年以降に観測所から報告された平均気温の記録を含む配列フィールドhistory_temperatures があり、2009年(10番目に記録された)の気温が23℃を超える観測所を見つけたい場合、この式を使用します:
filter='history_temperatures[10] > 23'
これらの基本演算子についての詳細は、基本演算子を参照してください。
フィルタ式のテンプレート
日中韓の文字を使ってフィルタリングする場合、文字セットとエンコーディングの違いが大きいため、処理が複雑になることがあります。その結果、特にIN 演算子のパフォーマンスが低下することがあります。
Milvusは、日中韓文字を扱う際のパフォーマンスを最適化するために、フィルター式のテンプレートを導入しました。フィルター式から動的な値を分離することで、クエリーエンジンはパラメーターの挿入をより効率的に処理します。
例
北京」(北京)または「上海」(上海)に住む25歳以上の個人を検索するには、次のテンプレート式を使用します:
filter = "age > 25 AND city IN ['北京', '上海']"
パフォーマンスを向上させるには、パラメータ付きのこのバリエーションを使用します:
filter = "age > {age} AND city in {city}",
filter_params = {"age": 25, "city": ["北京", "上海"]}
この方法は、構文解析のオーバーヘッドを減らし、クエリの速度を向上させます。詳細はフィルタのテンプレート化 を参照してください。
データ型固有の演算子
Milvusは、JSON、ARRAY、VARCHARフィールドなどの特定のデータ型に対する高度なフィルタリング演算子を提供しています。
JSON フィールド固有の演算子
Milvusは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 演算子」を参照してください。
ARRAY フィールド固有の演算子
Milvusは、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 演算子を参照してください。
VARCHAR フィールド固有の演算子
MilvusはVARCHARフィールドをテキストベースで正確に検索するために特化した演算子を提供しています:
TEXT_MATCH 演算子
TEXT_MATCH 演算子を使用すると、特定のクエリ語に基づいて文書を正確に検索することができます。スカラーフィルタとベクトル類似検索を組み合わせたフィルタ検索に特に便利です。セマンティック検索とは異なり、Text Matchは正確な用語の出現に焦点を当てる。
MilvusはTantivyを使用して、転置インデックスと用語ベースのテキスト検索をサポートしている。プロセスには以下が含まれる:
アナライザー:入力テキストをトークン化し、処理する。
インデックス作成:一意のトークンを文書にマッピングする転置インデックスを作成する。
詳細はテキストマッチを参照。
PHRASE_MATCH 演算子Compatible with Milvus 2.6.x
PHRASE_MATCH演算子は、クエリ語の順序と隣接性の両方を考慮した上で、 フレーズの完全一致に基づくドキュメントの正確な検索を可能にします。
詳細はPhrase Matchを参照。