クエリには入力ベクトルに加え、各ベクトルに付いた ベクトルメタデータ でも絞り込めます。クエリ結果には、filter 条件に一致するベクトルだけが含まれます。先に filter を適用し、絞り込んだ集合から topK 件を取ります。
メタデータフィルターでクエリ範囲を狭めれば、特定の顧客 ID、テナント、製品カテゴリなど、ベクトルに付けた任意のメタデータで絞り込めます。
Vectorize は既定で 名前空間 による絞り込みに対応します。ベクトルの別のメタデータプロパティで絞り込むには、メタデータインデックスを作成します。Vectorize インデックスあたり、メタデータインデックスは最大 10 個まで作成できます。
string、number、boolean 型のプロパティ向けメタデータインデックスに対応しています。詳細は メタデータインデックスを作成する を参照してください。
ベクトルあたり最大 10KiB のメタデータを保存できます。制限の一覧は Vectorize の制限 を参照してください。
number 型のメタデータインデックスでは、インデックスする数値の精度は float64 です。
string 型のメタデータインデックスでは、各ベクトルは文字列データの先頭 64B をインデックスします。切り捨ては UTF-8 の文字境界で行い、その上限内で最も長い整形式の UTF-8 部分文字列にします。そのため、インデックスした各プロパティについて、値の先頭 64B でフィルターできます。
query() メソッドの任意の filter プロパティで、メタデータフィルターを指定します。
| 演算子 | 説明 |
|---|---|
$eq |
等しい |
$ne |
等しくない |
$in |
いずれかに含まれる |
$nin |
いずれにも含まれない |
$lt |
より小さい |
$lte |
以下 |
$gt |
より大きい |
$gte |
以上 |
filterは空でないオブジェクトで、コンパクトな JSON 表現が 2048 バイト未満である必要があります。filterオブジェクトのキーは空にできません。" | .を含められず(ドットはネスト用に予約)、$で始められず、512 文字を超えられません。$eqと$neでは、filterオブジェクトの非ネスト値はstring、number、boolean、またはnullにできます。$inと$ninでは、filterオブジェクトの値はstring、number、boolean、またはnullの配列にできます。- 上限の範囲クエリ(
$ltと$lte)は、同じフィルター内で下限の範囲クエリ($gtと$gte)と組み合わせられます。ほかの組み合わせはできません。 - 範囲クエリ(
$lt、$lte、$gt、$gte)では、filterオブジェクトの非ネスト値はstringまたはnumberにできます。文字列は辞書順です。 - ベクトル数が多い範囲クエリ(約 1,000 万件以上)では、精度が下がることがあります。
名前空間 とメタデータフィルターは、どちらもクエリのベクトル検索空間を狭めます。両方のフィルターを検討するときは、次の点を考慮してください。
- 名前空間フィルターは、メタデータフィルターより先に適用されます。
- ベクトルが所属できる名前空間は 1 つで、記載の 制限 が適用されます。ベクトルメタデータには、ベクトルあたりのメタデータ上限 まで複数のキーと値のペアを含められます。メタデータ値は型(
string、booleanなど)が違うため、より柔軟です。
{ "streaming_platform": "netflix" }{ "someKey": { "$ne": "hbo" } }{ "someKey": { "$in": ["hbo", "netflix"] } }{ "someKey": { "$nin": ["hbo", "netflix"] } }{ "timestamp": { "$gte": 1734242400, "$lt": 1734328800 } }範囲クエリは、文字列メタデータフィールドで プレフィックス検索 を実現できます。starts_with フィルターに近い動きです。
たとえば、次のフィルターは "net" で始まるすべての値に一致します。
{ "someKey": { "$gte": "net", "$lt": "neu" } }{ "pandas.nice": 42, "someKey": { "$ne": "someValue" } }{ "pandas.nice": 42 }
// looks for { "pandas": { "nice": 42 } }次のインデックス定義で:
npx wrangler vectorize create tutorial-index --dimensions=32 --metric=cosineメタデータインデックスを作成します。
npx wrangler vectorize create-metadata-index tutorial-index --property-name=url --type=stringnpx wrangler vectorize create-metadata-index tutorial-index --property-name=streaming_platform --type=stringメタデータは、ベクトルの挿入または upsert 時に追加できます。
const newMetadataVectors: Array<VectorizeVector> = [
{
id: "1",
values: [32.4, 74.1, 3.2, ...],
metadata: { url: "/products/sku/13913913", streaming_platform: "netflix" },
},
{
id: "2",
values: [15.1, 19.2, 15.8, ...],
metadata: { url: "/products/sku/10148191", streaming_platform: "hbo" },
},
{
id: "3",
values: [0.16, 1.2, 3.8, ...],
metadata: { url: "/products/sku/97913813", streaming_platform: "amazon" },
},
{
id: "4",
values: [75.1, 67.1, 29.9, ...],
metadata: { url: "/products/sku/418313", streaming_platform: "netflix" },
},
{
id: "5",
values: [58.8, 6.7, 3.4, ...],
metadata: { url: "/products/sku/55519183", streaming_platform: "hbo" },
},
];
// Upsert vectors with added metadata, returning a count of the vectors upserted and their vector IDs
let upserted = await env.YOUR_INDEX.upsert(newMetadataVectors);query() メソッドを使います。
let queryVector: Array<number> = [54.8, 5.5, 3.1, ...];
let originalMatches = await env.YOUR_INDEX.query(queryVector, {
topK: 3,
returnValues: true,
returnMetadata: 'all',
});メタデータフィルターなしの結果:
{
"count": 3,
"matches": [
{
"id": "5",
"score": 0.999909486,
"values": [58.79999923706055, 6.699999809265137, 3.4000000953674316],
"metadata": {
"url": "/products/sku/55519183",
"streaming_platform": "hbo"
}
},
{
"id": "4",
"score": 0.789848214,
"values": [75.0999984741211, 67.0999984741211, 29.899999618530273],
"metadata": {
"url": "/products/sku/418313",
"streaming_platform": "netflix"
}
},
{
"id": "2",
"score": 0.611976262,
"values": [15.100000381469727, 19.200000762939453, 15.800000190734863],
"metadata": {
"url": "/products/sku/10148191",
"streaming_platform": "hbo"
}
}
]
}同じ query() メソッドに filter プロパティを付けると、メタデータフィルターを使えます。
let queryVector: Array<number> = [54.8, 5.5, 3.1, ...];
let metadataMatches = await env.YOUR_INDEX.query(queryVector, {
topK: 3,
filter: { streaming_platform: "netflix" },
returnValues: true,
returnMetadata: 'all',
});メタデータフィルターありの結果:
{
"count": 2,
"matches": [
{
"id": "4",
"score": 0.789848214,
"values": [75.0999984741211, 67.0999984741211, 29.899999618530273],
"metadata": {
"url": "/products/sku/418313",
"streaming_platform": "netflix"
}
},
{
"id": "1",
"score": 0.491185264,
"values": [32.400001525878906, 74.0999984741211, 3.200000047683716],
"metadata": {
"url": "/products/sku/13913913",
"streaming_platform": "netflix"
}
}
]
}- 現時点では、メタデータフィルターを使うには、ベクトルを挿入する 前 に Vectorize インデックスへメタデータインデックスを作成する必要があります。
- メタデータフィルターに対応するのは、2023-12-06 以降に作成したインデックスだけです。それ以前に作成したインデックスは、メタデータフィルター対応へ移行できません。