INTEGRITY Dokumentace

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

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í:

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=cosine

Vytváření indexů metadat:

npx wrangler vectorize create-metadata-index tutorial-index --property-name=url --type=string
npx wrangler vectorize create-metadata-index tutorial-index --property-name=streaming_platform --type=string

Metadata 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í