フィルタリングの説明
Milvusはデータの正確なクエリを可能にする強力なフィルタリング機能を提供します。フィルタ式を使用すると、特定のスカラーフィールドを対象とし、さまざまな条件で検索結果を絞り込むことができます。このガイドでは、Milvusにおけるフィルタ式の使用方法を、クエリ操作に焦点を当てた例を用いて説明します。また、検索や削除のリクエストでもこれらのフィルタを適用することができます。
基本演算子
Milvusはデータをフィルタリングするためのいくつかの基本的な演算子をサポートしています。
比較演算子:
==
!=
,>
,<
,>=
, および<=
では、数値、テキスト、または日付フィールドに基づくフィルタリングが可能です。範囲フィルター:
IN
とLIKE
は、特定の値の範囲やセットにマッチさせるのに役立ちます。算術演算子:
+
-
,*
,/
,%
, および**
は、数値フィールドを含む計算に使用されます。論理演算子:
AND
OR
、NOT
は、複数の条件を組み合わせて複雑な式にします。
例色によるフィルタリング
スカラー・フィールド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'
例配列フィールドのフィルタリング
例:配列フィールドのフィルタリングhistory_temperatures
に気温の記録があり、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 フィールド固有の演算子
**Text_Match**
演算子を使うと、特定のクエリ語に基づいてドキュメントを正確に検索できます。スカラーフィルタとベクトル類似検索を組み合わせたフィルタ検索に特に便利です。セマンティック検索とは異なり、Text Matchは正確な用語の出現に焦点を当てる。
MilvusはTantivyを使用して、転置インデックスと用語ベースのテキスト検索をサポートしている。プロセスには以下が含まれる。
アナライザー:入力テキストをトークン化し、処理する。
インデックス作成:一意のトークンを文書にマッピングする転置インデックスを作成する。
詳細はテキストマッチを参照。