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

フィルターテンプレート

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 辞書を使用することで、複雑なフィルター式の解析に費やす時間を大幅に短縮できます。これにより、クエリの実行が高速化され、全体的なパフォーマンスが向上します。

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