← Cloudflare Vectorize / vectorize / reference
Filtrování metadat
Kromě vstupního vektoru k dotazu můžete také filtrovat podle metadata vektoru přiřazené ke každému vektoru. Výsledky dotazu budou obsahovat pouze vektory, které odpovídají filter kritéria, což znamená, že filter se použije jako první a topK výsledky se berou z filtrované sady.
Pomocí filtrování podle metadat, kterým omezíte rozsah dotazu, můžete filtrovat podle konkrétních ID zákazníků, tenantů, kategorie produktu nebo jakýchkoli jiných metadat přiřazených k vašim vektorům.
Indexy metadat
Vectorize podporuje namespace filtrování ve výchozím nastavení, ale pro filtrování podle jiné vlastnosti metadat vašich vektorů budete muset vytvořit index metadat. Na jeden index Vectorize můžete vytvořit až 10 indexů metadat.
Indexy metadat pro vlastnosti typu string, number a boolean jsou podporovány. Další informace najdete v Vytváření indexů metadat s podrobnostmi.
Pro každý vektor můžete uložit až 10KiB metadat. Viz Limity Vectorize pro úplný seznam limitů.
U metadatových indexů typu number, je přesnost indexovaného čísla float64.
U metadatových indexů typu string, každý vektor indexuje prvních 64 B textových dat oříznutých na hranicích znaků UTF-8 na nejdelší platný podřetězec UTF-8 v rámci tohoto limitu, takže vektory lze filtrovat podle prvních 64 B hodnoty každé indexované vlastnosti.
Podporované operace
Volitelný filter vlastnost na query() metoda určuje filtry metadat:
| Operátor | Popis |
|---|---|
$eq |
Rovná se |
$ne |
Nerovná se |
$in |
V |
$nin |
Není v |
$lt |
Less than |
$lte |
Less than or equal to |
$gt |
Větší než |
$gte |
Větší nebo rovno |
filtermusí být neprázdný objekt, jehož kompaktní reprezentace JSON musí mít méně než 2048 bajtů.filterklíče objektu nesmí být prázdné, obsahovat" | .(tečka je vyhrazena pro vnořování), začínat$, ani být delší než 512 znaků.- Pro
$eqa$ne,filternevnořené hodnoty objektu mohou býtstring,number,boolean, nebonullhodnoty. - Pro
$ina$nin,filterhodnoty objektu mohou být polestring,number,boolean, nebonullhodnoty. - Dotazy na horní hranici rozsahu (tj.
$lta$lte) lze kombinovat s dotazy na rozsah se spodní hranicí (tj.$gta$gte) v rámci stejného filtru. Jiné kombinace nejsou povoleny. - U rozsahových dotazů (tj.
$lt,$lte,$gt,$gte),filternevnořené hodnoty objektu mohou býtstringnebonumberhodnoty. Řetězce jsou řazeny lexikograficky. - Rozsahové dotazy zahrnující velký počet vektorů (~10M a více) mohou mít sníženou přesnost.
Namespace versus filtrování podle metadat
Obojí jmenné prostory a filtrování metadat zužují prostor vektorového vyhledávání pro daný dotaz. Při posuzování obou typů filtrů zvažte následující:
- Filtr jmenného prostoru se použije před filtrem (filtry) metadat.
- Vektor může být součástí pouze jednoho jmenného prostoru s uvedeným limity. Metadata vektoru mohou obsahovat více párů klíč a hodnota až do limity metadat na vektor. Hodnoty metadat podporují různé typy (
string,boolean, a dalších), čímž nabízí větší flexibilitu.
Platný filter příklady
Implicitní $eq operátor
{ "streaming_platform": "netflix" }Explicitní operátor
{ "someKey": { "$ne": "hbo" } }$in operátor
{ "someKey": { "$in": ["hbo", "netflix"] } }$nin operátor
{ "someKey": { "$nin": ["hbo", "netflix"] } }Rozsahový dotaz s čísly
{ "timestamp": { "$gte": 1734242400, "$lt": 1734328800 } }Rozsahový dotaz s řetězci
Rozsahové dotazy lze implementovat pomocí vyhledávání pomocí prefixu u textových polí metadat. To je také podobné starts_with filtr.
Například následující filtr odpovídá všem hodnotám začínajícím na "net":
{ "someKey": { "$gte": "net", "$lt": "neu" } }Implicitní logické AND s více klíči
{ "pandas.nice": 42, "someKey": { "$ne": "someValue" } }Klíče definují vnořování pomocí . (tečka)
{ "pandas.nice": 42 }
// looks for { "pandas": { "nice": 42 } }Příklady
Přidání metadat
S následující definicí indexu:
npx wrangler vectorize create tutorial-index --dimensions=32 --metric=cosineVytváření indexů metadat:
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=stringMetadata lze přidat při vkládání nebo upsertování vektorů.
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);Příklady dotazů
Použijte query() metoda:
let queryVector: Array<number> = [54.8, 5.5, 3.1, ...];
let originalMatches = await env.YOUR_INDEX.query(queryVector, {
topK: 3,
returnValues: true,
returnMetadata: 'all',
});Výsledky bez filtrování podle metadat:
{
"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"
}
}
]
}Stejné query() metodu s filter podporuje filtrování metadat.
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',
});Výsledky s filtrováním podle metadat:
{
"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"
}
}
]
}Omezení
- V současné době je nutné vytvořit indexy metadat pro indexy Vectorize před vektorů lze vložit pro podporu filtrování metadat.
- Filtrování podle metadat podporují pouze indexy vytvořené dne 2023-12-06 nebo později. Dříve vytvořené indexy nelze na podporu filtrování podle metadat dodatečně migrovat.