← Cloudflare Vectorize / vectorize / reference
Фильтрация метаданных
Помимо входного вектора запроса, вы также можете выполнять фильтрацию по метаданные вектора связанных с каждым вектором. Результаты запроса будут включать только векторы, соответствующие filter критериям, что означает, что filter применяется первым, а topK результаты берутся из отфильтрованного набора.
Используя фильтрацию по метаданным для ограничения области запроса, вы можете фильтровать по конкретным ID клиентов, арендатору, категории продукта или любым другим метаданным, связанным с вашими векторами.
Индексы метаданных
Vectorize поддерживает пространство имён фильтрацию по умолчанию, но для фильтрации по другому свойству метаданных ваших векторов потребуется создать индекс метаданных. Вы можете создать до 10 индексов метаданных на один индекс Vectorize.
Индексы метаданных для свойств типа string, number и boolean поддерживаются. Подробнее см. в Создание индексов метаданных для получения подробностей.
На один вектор можно сохранить до 10 КиБ метаданных. См. Ограничения Vectorize для получения полного списка ограничений.
Для индексов метаданных типа number, точность индексируемых чисел соответствует float64.
Для индексов метаданных типа string, каждый вектор индексирует первые 64 байта строковых данных, усечённых по границам символов UTF-8 до самой длинной корректной подстроки UTF-8 в пределах этого лимита, поэтому векторы можно фильтровать по первым 64 байтам значения для каждого индексируемого свойства.
Поддерживаемые операции
Необязательный filter свойство у query() метод задаёт фильтры метаданных:
| Оператор | Описание |
|---|---|
$eq |
Equals |
$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значений. Строки упорядочиваются лексикографически. - При диапазонных запросах с большим количеством векторов (~10M и более) точность может снижаться.
Пространство имён в сравнении с фильтрацией по метаданным
Оба пространства имён и фильтрация по метаданным сужают пространство векторного поиска для запроса. При оценке обоих типов фильтров учитывайте следующее:
- Фильтр по пространству имён применяется до фильтра(ов) по метаданным.
- Вектор может входить только в одно пространство имён с учётом задокументированных ограничения. Метаданные вектора могут содержать несколько пар «ключ-значение» общим объёмом до лимиты метаданных на вектор. Значения метаданных поддерживают разные типы (
string,boolean, и другие), что обеспечивает большую гибкость.
Действителен filter примеры
Неявный $eq оператор
{ "streaming_platform": "netflix" }Явный оператор
{ "someKey": { "$ne": "hbo" } }$in оператор
{ "someKey": { "$in": ["hbo", "netflix"] } }$nin оператор
{ "someKey": { "$nin": ["hbo", "netflix"] } }Диапазонный запрос с числами
{ "timestamp": { "$gte": 1734242400, "$lt": 1734328800 } }Диапазонный запрос со строками
Диапазонные запросы можно реализовать с помощью поиск по префиксу для строковых полей метаданных. Это также похоже на starts_with фильтр.
Например, следующий фильтр соответствует всем значениям, начинающимся с «net»:
{ "someKey": { "$gte": "net", "$lt": "neu" } }Неявный логический AND с несколькими ключами
{ "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 или позже. Индексы, созданные ранее, нельзя перевести на поддержку фильтрации по метаданным.