# Qdrant Formula Query: как дать бонус записям с нужной меткой

Источник: https://modelium.tech/zhurnal/qdrant-formula-query/

Formula Query в Qdrant пересчитывает оценку уже найденных точек: к оценке похожести можно добавить бонус записи с определённой меткой. Ниже две искусственные записи и сравнение порядка до и после бонуса. Нужны работающий Qdrant v1.19.x и терминал; редакция не запускала сервер, пример сверен с документацией и проверен только на HTTP-фикстуре.

**Технический уровень.** Нужны работающий Qdrant v1.19.x на своём компьютере, Linux/macOS и `curl`. Это не домашний рецепт установки AI-модели. Инструкция сверена с документацией 19 октября 2026 года; редакция проверила команды на имитации HTTP-ответов, но не запускала Qdrant. Пример без ключа обращается к `127.0.0.1`: не открывайте тестовый сервер в сеть. [s2](#src-s2) [s5](#src-s5)

## Зачем менять порядок найденных записей?

Представьте два коротких фрагмента каталога: первый чуть ближе к запросу по смыслу, второй имеет метку `featured`. Qdrant обычно сортирует найденные векторы — списки чисел, представляющих объекты, — по мере похожести. Formula Query позволяет **после предварительного поиска** (`prefetch`) прибавить небольшой бонус совпавшей метке и пересортировать найденные записи. Это не фильтр: неподходящая запись остаётся кандидатом. Прибавку подбирают на собственных данных, а не считают универсальной настройкой. [s1](#src-s1) [s2](#src-s2) [s6](#src-s6)

## Как сравнить две выдачи на учебных данных?

Сначала [подготовьте локальный Qdrant](/zhurnal/qdrant-lokalno/). В терминале Linux/macOS используйте только новую учебную коллекцию `demo_formula_20261019`; **не выполняйте команды над рабочими данными**. Если имя уже занято, остановитесь и замените его во всех командах. Числовые векторы и метки придуманы для демонстрации: AI-модель их не создавала. [s3](#src-s3) [s4](#src-s4) [s5](#src-s5)

- Создайте пустую коллекцию: `curl -fsS -X PUT 'http://127.0.0.1:6333/collections/demo_formula_20261019' -H 'Content-Type: application/json' -d '{"vectors":{"size":2,"distance":"Cosine"}}'`. Ожидайте `status: ok` и `result: true`; если имя занято, возьмите другое. [s3](#src-s3)

- Запишите две точки с разными метками: `curl -fsS -X PUT 'http://127.0.0.1:6333/collections/demo_formula_20261019/points?wait=true' -H 'Content-Type: application/json' -d '{"points":[{"id":1,"vector":[1,0],"payload":{"tag":"ordinary"}},{"id":2,"vector":[0.8,0.6],"payload":{"tag":"featured"}}]}'`. Ожидайте `result.status: completed`; повторный upsert с теми же ID перезапишет точки. [s4](#src-s4)

- Получите исходную выдачу: `curl -fsS -X POST 'http://127.0.0.1:6333/collections/demo_formula_20261019/points/query' -H 'Content-Type: application/json' -d '{"query":[1,0],"limit":2,"params":{"exact":true},"with_payload":true}'`. В `result.points` сравните `id`, `score` и `payload.tag`: без бонуса ID `1` ожидается выше ID `2` (косинусная близость учебных единичных векторов: 1 против 0.8). Это **расчётный ориентир**, не наш замер сервера. [s2](#src-s2)

- Пересчитайте оценки: `curl -fsS -X POST 'http://127.0.0.1:6333/collections/demo_formula_20261019/points/query' -H 'Content-Type: application/json' -d '{"prefetch":{"query":[1,0],"limit":2,"params":{"exact":true}},"query":{"formula":{"sum":["$score",{"mult":[0.3,{"key":"tag","match":{"any":["featured"]}}]}]}},"limit":2,"with_payload":true}'`. Теперь для ID `2` ожидается расчётная оценка 0.8 + 0.3 = 1.1, а для ID `1` — 1: порядок должен поменяться, **если** сервер выполнил пример и обе точки попали в `prefetch`. Поле `tag` — метаданные записи (`payload`); совпадение условия даёт 1, несовпадение 0. Настоящий ответ Qdrant редакция не измеряла. [s1](#src-s1) [s2](#src-s2)

## Что делать, если порядок не изменился?

Убедитесь, что upsert завершён и `prefetch.limit` не меньше числа проверяемых кандидатов. Проверьте точные значения `payload.tag` и наличие `result.points`: формула пересчитывает **только предварительно найденные** точки, а не ищет в коллекции заново. Для других метрик расстояния и объёмов данных бонус 0.3 не переносится без проверки; при распределённом поиске есть дополнительные особенности вложенных запросов. Если метка означает право доступа или обязательное исключение, используйте [фильтр полей](/zhurnal/qdrant-filtry-metadannyh/) и отдельно проверьте ограничения на своём сервере: бонус не обеспечивает изоляцию. [s1](#src-s1) [s6](#src-s6)

## Источники

1. [Qdrant — Search Relevance: Score Boosting](https://qdrant.tech/documentation/search/search-relevance/index.md) — получено 2026-10-19
2. [Qdrant API v1.19.x — Query points](https://api.qdrant.tech/v-1-19-x/api-reference/search/query-points.md) — получено 2026-10-19
3. [Qdrant API v1.19.x — Create a collection](https://api.qdrant.tech/v-1-19-x/api-reference/collections/create-collection.md) — получено 2026-10-19
4. [Qdrant API v1.19.x — Upsert points](https://api.qdrant.tech/v-1-19-x/api-reference/points/upsert-points.md) — получено 2026-10-19
5. [Qdrant — Local Quickstart](https://qdrant.tech/documentation/quickstart/index.md) — получено 2026-10-19
6. [Qdrant — Hybrid and Multi-Stage Queries](https://qdrant.tech/documentation/search/hybrid-queries/index.md) — получено 2026-10-19
