← Обзор / ai-search / configuration / retrieval
Фильтрация
Фильтрация метаданных сужает результаты поиска на основе метаданных, поэтому извлекается только релевантный контент. Фильтр применяется до поиска, поэтому запрос выполняется только к нужным документам.
Фильтрация использует атрибуты метаданных, извлечённые во время индексирования. Об определении пользовательских атрибутов и использовании встроенных атрибутов метаданных см. в Атрибуты метаданных.
AI Search может хранить строковые значения длиннее фильтруемого префикса. Фильтры учитывают только первые 64 байта UTF-8 каждой проиндексированной строки. Vectorize может хранить массивы строк, но пока не индексирует и не фильтрует их.
Вот пример фильтрации по метаданным с использованием привязка Workers:
const instance = env.AI_SEARCH.get("my-instance");
const results = await instance.search({
messages: [{ role: "user", content: "What is Cloudflare?" }],
ai_search_options: {
retrieval: {
filters: {
folder: "docs/getting-started/",
timestamp: { $gte: 1735689600 },
},
},
},
});Синтаксис фильтра
Фильтры представляют собой объекты JSON, в которых ключи это имена атрибутов метаданных, а значения задают условие фильтрации.
Поддерживаемые операторы
| Оператор | Описание |
|---|---|
$eq |
Equals |
$ne |
Не равно |
$in |
Сопоставляет сохранённое скалярное значение с любым скалярным значением кандидата |
$nin |
Исключает сохранённое скалярное значение, совпадающее с любым из проверяемых скалярных значений |
$lt |
Меньше |
$lte |
Меньше или равно |
$gt |
Больше |
$gte |
Больше или равно |
Неявный $eq
Если указать прямое значение без оператора, оно интерпретируется как проверка на равенство:
{
"ai_search_options": {
"retrieval": {
"filters": { "folder": "docs/getting-started/" }
}
}
}Это эквивалентно:
{
"ai_search_options": {
"retrieval": {
"filters": { "folder": { "$eq": "docs/getting-started/" } }
}
}
}Запросы по диапазону
Объедините операторы верхней и нижней границы для фильтрации по диапазонам:
{
"ai_search_options": {
"retrieval": {
"filters": { "timestamp": { "$gte": 1735689600, "$lt": 1735900000 } }
}
}
}Несколько условий (неявное AND)
Если указать несколько ключей, должны выполняться все условия:
{
"ai_search_options": {
"retrieval": {
"filters": {
"folder": "docs/getting-started/",
"timestamp": { "$gte": 1735689600 }
}
}
}
}$in оператор
Сопоставляет сохранённое скалярное поле с любым значением в массиве кандидатов. $in не выполняет поиск внутри сохранённых массивов:
{
"ai_search_options": {
"retrieval": {
"filters": { "folder": { "$in": ["docs/guides/", "docs/tutorials/"] } }
}
}
}Фильтр «Starts with» для папок
Используйте запросы по диапазону, чтобы отфильтровать все файлы в папке и её подпапках.
Например, рассмотрим такую структуру файлов:
- Документация
- guide.pdf
- руководства
- Начало работы
- intro.pdf
- Начало работы
Использование { "folder": "docs/" } соответствует только файлам непосредственно в этой папке (например, guide.pdf), а не файлы в подпапках.
Чтобы найти все файлы, начинающиеся с docs/, используйте запрос по диапазону:
{
"ai_search_options": {
"retrieval": {
"filters": { "folder": { "$gte": "docs/", "$lt": "docs0" } }
}
}
}Это работает по следующей причине:
$gteвключает все пути, начинающиеся сdocs/$ltсdocs0исключает пути, которые не начинаются сdocs/(начиная с0идёт после/в ASCII)