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

フィルターのテンプレート化

Zilliz Cloud では、要素の多い複雑なフィルター式、特に CJK 文字などの非 ASCII 文字を含む式がクエリパフォーマンスに大きく影響する可能性があります。この課題に対処するため、Zilliz Cloud は、複雑な式の解析に費やす時間を削減して効率を高めるフィルター式のテンプレート化メカニズムを導入しています。このページでは、検索、クエリ、削除の各操作でフィルター式のテンプレート化を使用する方法を説明します。

Notes

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

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

概要​

フィルター式のテンプレート化を使用すると、クエリの実行時に値が動的に置き換えられるプレースホルダーを含むフィルター式を作成できます。テンプレート化を使用すると、大きな配列や複雑な式をフィルターに直接埋め込むことを避けられるため、解析時間が短縮され、クエリパフォーマンスが向上します。

age と city の 2 つのフィールドを含むフィルター式があり、年齢が 25 より大きく、「北京」(Beijing)または「上海」(Shanghai)に住んでいるすべての人を検索するとします。値をフィルター式に直接埋め込む代わりに、テンプレートを使用できます。

python
filter = "age > {age} AND city IN {city}"
filter_params = {"age": 25, "city": ["北京", "上海"]}

ここで、{age} と {city} はプレースホルダーであり、クエリの実行時に filter_params の実際の値に置き換えられます。

Zilliz Cloud でフィルター式のテンプレート化を使用すると、いくつかの重要な利点があります。

  • 解析時間の短縮: 大きなフィルター式や複雑なフィルター式をプレースホルダーに置き換えることで、システムがフィルターの解析と処理に費やす時間が短縮されます。

  • クエリパフォーマンスの向上: 解析のオーバーヘッドが削減されるとクエリパフォーマンスが向上し、QPS の増加と応答時間の短縮につながります。

  • スケーラビリティ: データセットが増大し、フィルター式が複雑になっても、テンプレート化によってパフォーマンスを効率的かつスケーラブルに保つことができます。

検索操作​

Zilliz Cloud の検索操作では、filter 式を使用してフィルター条件を定義し、filter_params パラメーターを使用してプレースホルダーの値を指定します。filter_params ディクショナリーには、Zilliz Cloud がフィルター式に代入する動的な値が含まれています。

python
expr = "age > {age} AND city IN {city}"
filter_params = {"age": 25, "city": ["北京", "上海"]}
res = client.search(
"hello_milvus",
[[0.1, 0.2]],
filter=expr,
limit=10,
output_fields=["age", "city"],
search_params={"params": {"search_list": 100}},
filter_params=filter_params,
)

この例では、Zilliz Cloud は検索の実行時に {age} を 25 に、{city} を ["北京", "上海"] に動的に置き換えます。

クエリ操作​

同じテンプレート化メカニズムは、Zilliz Cloud のクエリ操作にも適用できます。query 関数では、フィルター式を定義し、filter_params を使用して代入する値を指定します。

python
expr = "age > {age} AND city IN {city}"
filter_params = {"age": 25, "city": ["北京", "上海"]}
res = client.query(
"hello_milvus",
filter=expr,
output_fields=["age", "city"],
filter_params=filter_params
)

filter_params を使用すると、Zilliz Cloud は値の動的な挿入を効率的に処理し、クエリの実行速度を向上させます。

削除操作​

削除操作でもフィルター式のテンプレート化を使用できます。検索やクエリと同様に、filter 式で条件を定義し、filter_params でプレースホルダーの動的な値を指定します。

python
expr = "age > {age} AND city IN {city}"
filter_params = {"age": 25, "city": ["北京", "上海"]}
res = client.delete(
"hello_milvus",
filter=expr,
filter_params=filter_params
)

この方法により、特に複雑なフィルター条件を扱う場合に、削除操作のパフォーマンスが向上します。

正規表現フィルターテンプレート​

正規表現フィルターでは、フィルター式のテンプレート化を使用できます。これは、リクエスト時に正規表現パターンが提供される場合に便利です。

python
expr = "message =~ {pattern}"
filter_params = {"pattern": "E[0-9]{4}"}
res = client.query(
"hello_milvus",
filter=expr,
output_fields=["message"],
filter_params=filter_params,
)

!~ でテンプレートパラメーターを使用することもできます。

python
expr = "message !~ {pattern}"
filter_params = {"pattern": "^DEBUG"}

テンプレートの値は、有効な RE2 正規表現パターンを含む文字列である必要があります。Zilliz Cloud は、フィルターを実行する前にパターンを検証します。

フィルターテンプレートは、正規表現パターンをフィルター式に連結するのではなく、値として渡します。これにより、式の解析オーバーヘッドが削減され、パターンに引用符や演算子が含まれる場合にフィルター構造が誤って変更されることを回避できます。

まとめ​

フィルター式のテンプレート化は、Zilliz Cloud のクエリパフォーマンスを最適化するための不可欠なツールです。プレースホルダーと filter_params ディクショナリーを使用することで、複雑なフィルター式の解析に費やす時間を大幅に削減できます。これにより、クエリの実行が高速化され、全体のパフォーマンスが向上します。

このページは役に立ちましたか?