ベクター類似性検索だけでは、実際の要件を満たせないことがよくあります。アプリケーションでは通常、価格帯内のプロダクトのみを返す、特定のカテゴリのドキュメントのみを返すなど、メタデータによって結果を絞り込む必要があります。DashVector の条件付きフィルタリング機能を使用すると、ベクターにメタデータフィールドをアタッチし、クエリ時に filter 式を渡すことができます。これにより、条件に一致するベクターのみが類似性検索の結果に含まれるようになります。
クイックスタート
この例では、年齢が 18 歳より大きく、体重が 65 kg を超える男性をコレクションからクエリします。
docs = collection.query(
[0.1, 0.1, 0.1, 0.1],
topk=10,
filter='age > 18 and weight > 65.0 and male = true'
)filter パラメーターは、比較演算子、文字列演算子、論理演算子から構築されるブール式を受け入れます。完全な構文については、「フィルター式の構文」をご参照ください。
前提条件
開始する前に、以下のものがあることを確認してください。
DashVector の API キーとクラスターエンドポイント
quickstartという名前のコレクション。設定手順については、「コレクションの作成」の「例」セクションをご参照ください。
メタデータフィールドを持つドキュメントの挿入
quickstart コレクションにドキュメントを挿入します。各ドキュメントには、ID、4 次元のベクター、およびメタデータフィールドのセットが含まれます。
import dashvector
import numpy as np
client = dashvector.Client(
api_key='<your-api-key>',
endpoint='<your-cluster-endpoint>'
)
collection = client.get(name='quickstart')
ret = collection.insert([
('1', np.random.rand(4), {'name': 'alice', 'age': 10, 'male': True, 'weight': 35.0}),
('2', np.random.rand(4), {'name': 'bob', 'age': 20, 'male': False, 'weight': 45.0}),
('3', np.random.rand(4), {'name': 'carol', 'age': 30, 'male': True, 'weight': 75.0}),
('4', np.random.rand(4), {'name': 'dave', 'age': 5, 'male': False, 'weight': 18.0}),
('5', np.random.rand(4), {'name': 'eve', 'age': 40, 'male': True, 'weight': 70.0})
])
assert ret次のプレースホルダーを実際の値に置き換えてください。
| プレースホルダー | 説明 |
|---|---|
<your-api-key> | ご利用の DashVector API キー |
<your-cluster-endpoint> | ご利用のクラスターエンドポイント URL |
フィルター式を使用したクエリ
filter 文字列を collection.query() に渡して、結果を制限します。この例では、年齢が 18 歳より大きく、体重が 65 kg を超える男性を検索します。
import dashvector
client = dashvector.Client(
api_key='<your-api-key>',
endpoint='<your-cluster-endpoint>'
)
collection = client.get(name='quickstart')
# フィルター: 18 歳以上で体重が 65 kg を超える男性
docs = collection.query(
[0.1, 0.1, 0.1, 0.1],
topk=10,
filter='age > 18 and weight > 65.0 and male = true'
)
print(docs)フィルター式の構文
フィルター式は、論理演算子で結合された 1 つ以上の条件で構成されます。各条件は次のパターンに従います。
<field> <operator> <value>比較演算子
| 演算子 | 説明 | サポートされている型 | 例 | 一致する条件 |
|---|---|---|---|---|
< | より小さい | int、 float | age < 10 | age が 10 より小さい |
<= | 以下 | int、 float | weight <= 60.0 | weight が 60.0 以下 |
= | 等しい | int、 float、 bool、 str | name = 'alice' | name が alice |
!= | 等しくない | int、 float、 bool、 str | male != true | male が true ではない |
>= | 以上 | int、 float | age >= 10 | age が 10 以上 |
> | より大きい | int、 float | weight > 60.0 | weight が 60.0 を超える |
文字列演算子
str フィールドで前方一致を行うには、like 演算子を使用します。
| オペレーター | 説明 | 例 | 一致する条件 |
|---|---|---|---|
like | 前方一致 | name like 'al%' | name が al |
論理演算子
複数の条件を and または or で組み合わせます。
| 演算子 | 説明 | 例 | 一致する条件 |
|---|---|---|---|
and | 両方の条件が true である必要がある | age > 18 and male = true | age が 18 を超え、かつ male が true である |
or | 少なくとも 1 つの条件が true である必要がある | age < 10 or age > 60 | age が 10 未満、または 60 を超える |
括弧 () を使用して評価順序を制御します。例:
age > 18 and (weight > 65.0 or male = true)この式は、まず (weight > 65.0 or male = true) を評価し、その結果を age > 18 と組み合わせます。
サポートされているフィールドタイプ
DashVector のフィールドは、次の Python データ型をサポートしています。
| 型 | 説明 | 範囲 |
|---|---|---|
str | 文字列 | -- |
int | 整数 | 32 ビット符号付き: -2,147,483,648 ~ 2,147,483,647 |
float | 浮動小数点数 | -- |
bool | ブール値 | True または False |
Python の整数はサイズに制限がありませんが、DashVector がサポートするのは 32 ビット符号付き整数のみです。オーバーフローを避けるため、整数値が -2,147,483,648 から 2,147,483,647 の範囲に収まるようにしてください。