メインコンテンツまでスキップ
バージョン: User Guides (BYOC)

フィルタリング検索

ANN 検索は、指定されたベクトル埋め込みに最も類似したベクトル埋め込みを検出します。ただし、検索結果が常に正しいとは限りません。検索リクエストにフィルタリング条件を含めることで、Zilliz Cloud は ANN 検索を実行する前にメタデータのフィルタリングを行い、コレクション全体から指定されたフィルタリング条件に一致するエンティティのみに検索範囲を絞り込むことができます。

概要

Zilliz Cloud では、フィルタリングが適用される段階に応じて、フィルタリング検索は 標準フィルタリング反復フィルタリング の2種類に分類されます。

標準フィルタリング

コレクションにベクトル埋め込みとそのメタデータの両方が含まれている場合、ANN 検索の前にメタデータをフィルタリングすることで、検索結果の関連性を向上させることができます。Zilliz Cloud がフィルタリング条件を含む検索リクエストを受信すると、指定されたフィルタリング条件に一致するエンティティ内でのみ検索範囲を制限します。

QIeKwvDN1h7lTnb9iJ7cPubknrb

上記の図に示すように、検索リクエストには chunk like "%red%" というフィルタリング条件が含まれており、これは chunk フィールドに red という単語を含むすべてのエンティティ内で ANN 検索を実行することを意味します。具体的には、Zilliz Cloud は以下の処理を行います。

  • 検索リクエストに含まれるフィルタリング条件に一致するエンティティをフィルタリングする。
  • フィルタリングされたエンティティ内で ANN 検索を実行する。
  • 上位 K 件のエンティティを返す。

反復フィルタリング

標準フィルタリングプロセスは、検索範囲を効果的に狭い範囲に絞り込みます。しかし、フィルタリング式が過度に複雑になると、検索レイテンシが非常に高くなる可能性があります。このような場合、反復フィルタリングを代替手段として利用することで、スカラー(scalar)フィルタリングの負荷を軽減できます。

AOJ0wZxInhw0z8bZJtWcHMpfnCh

上記の図に示すように、反復フィルタリングを用いた検索では、ベクトル検索を反復的に行います。イテレータによって返された各エンティティに対してスカラー(scalar)フィルタリングが適用され、指定された topK 件数の結果が得られるまでこのプロセスが繰り返されます。

この方法により、スカラー(scalar)フィルタリングの対象となるエンティティ数を大幅に削減できるため、特に高度に複雑なフィルタリング式を扱う際に有効です。

ただし、イテレータはエンティティを1つずつ順次処理する点に注意が必要です。この逐次処理方式は、スカラー(scalar)フィルタリングの対象となるエンティティ数が多い場合、処理時間が長くなったり、パフォーマンス上の問題が発生したりする可能性があります。

このセクションでは、フィルタリング検索の実行方法を説明します。ここに記載するコードスニペットは、すでにコレクション内に以下のエンティティが存在していることを前提としています。各エンティティには、idvectorcolorlikes の4つのフィールドがあります。

[
{"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682", "likes": 165},
{"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025", "likes": 25},
{"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781", "likes": 764},
{"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298", "likes": 234},
{"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794", "likes": 122},
{"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222", "likes": 12},
{"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392", "likes": 58},
{"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510", "likes": 775},
{"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381", "likes": 876},
{"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976", "likes": 765}
]
📘Notes

クエリベクトルがすでにターゲットコレクションに存在する場合は、検索前にそれらを取得する代わりに ids を使用することを検討してください。詳細については、Primary-キー Search を参照してください。

標準フィルタリングを使用した検索

以下のコードスニペットは、標準フィルタリングを使用した検索を示しており、次のコードスニペットのリクエストにはフィルタリング条件といくつかの出力フィールドが含まれています。

from pymilvus import MilvusClient

client = MilvusClient(
uri="YOUR_CLUSTER_ENDPOINT",
token="YOUR_CLUSTER_TOKEN"
)

query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]

res = client.search(
collection_name="my_collection",
data=[query_vector],
limit=5,
filter='color like "red%" and likes > 50',
output_fields=["color", "likes"]
)

for hits in res:
print("TopK results:")
for hit in hits:
print(hit)

検索リクエストに含まれるフィルタリング条件は color like "red%" and likes > 50 です。この条件は and 演算子を使用して2つの条件を組み合わせています。1つ目の条件は、color フィールドの値が red で始まるエンティティを要求し、もう1つの条件は、likes フィールドの値が 50 より大きいエンティティを要求します。これらの要件を満たすエンティティは2つしか存在しません。top-K が 3 に設定されているため、Zilliz Cloud はこの2つのエンティティとクエリベクトルとの距離を計算し、検索結果として返します。

[
{
"id": 4,
"distance": 0.3345786594834839,
"entity": {
"vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106],
"color": "red_4794",
"likes": 122
}
},
{
"id": 6,
"distance": 0.6638239834383389
"entity": {
"vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987],
"color": "red_9392",
"likes": 58
}
},
]

メタデータフィルタリングで使用できる演算子の詳細については、フィルタリングを参照してください。

反復フィルタリングを使用した検索

反復フィルタリングによるフィルタリング検索を実行するには、次のようにします:

from pymilvus import MilvusClient

client = MilvusClient(
uri="YOUR_CLUSTER_ENDPOINT",
token="YOUR_CLUSTER_TOKEN"
)

query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]

res = client.search(
collection_name="my_collection",
data=[query_vector],
limit=5,
filter='color like "red%" and likes > 50',
output_fields=["color", "likes"],
search_params={
"hints": "iterative_filter"
}
)

for hits in res:
print("TopK results:")
for hit in hits:
print(hit)