# Qdrant group by: как сгруппировать фрагменты по документам

Источник: https://modelium.tech/zhurnal/qdrant-gruppirovka-po-dokumentu/

Если поиск в Qdrant возвращает несколько фрагментов одного документа подряд, запрос групп с group_by: document_id собирает их по идентификатору документа. Укажите group_size: 1, чтобы получить не более одного фрагмента внутри каждой группы. Ниже — пример на искусственных данных; настоящий Qdrant редакция не запускала.

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

## Зачем группировать найденные фрагменты?

Если один документ разбит на части, обычный поиск может показать несколько его частей подряд, вытеснив другие документы. В Qdrant каждая часть — **точка** с вектором (числовым представлением для поиска) и дополнительными полями (*payload*). Запишите в поле `document_id` один и тот же идентификатор для частей одного документа; запрос групп соберёт результаты с одинаковым значением в одну группу. Это **не удаляет** повторяющиеся точки из коллекции. [s1](#src-s1) [s2](#src-s2) [s5](#src-s5)

## Как сравнить обычную выдачу и группы?

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

- Создайте отдельную коллекцию: `curl -fsS -X PUT 'http://127.0.0.1:6333/collections/demo_group_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_group_20261019/points?wait=true' -H 'Content-Type: application/json' -d '{"points":[{"id":1,"vector":[1,0],"payload":{"document_id":"a","part":1}},{"id":2,"vector":[0.9,0.1],"payload":{"document_id":"a","part":2}},{"id":3,"vector":[0.8,0.2],"payload":{"document_id":"b","part":1}},{"id":4,"vector":[0,1],"payload":{"document_id":"c","part":1}}]}'`. Дождитесь `status: ok` и `result.status: completed`. Повторный Upsert с существующим ID перезаписывает точку — никогда не направляйте этот пример в рабочую коллекцию. [s4](#src-s4)

- Сравните обычный поиск с вектором `[1,0]`: `curl -fsS -X POST 'http://127.0.0.1:6333/collections/demo_group_20261019/points/query' -H 'Content-Type: application/json' -d '{"query":[1,0],"limit":3,"with_payload":true}'`. В неизменённом учебном наборе ожидайте в `result.points` сначала точки с ID 1 и 2 из документа `a`, затем ID 3 из `b`. Это **ожидаемая** последовательность на указанных векторах, не снятый редакцией ответ Qdrant. [s2](#src-s2) [s4](#src-s4)

- Попросите Qdrant вернуть две группы, по одному фрагменту на документ: `curl -fsS -X POST 'http://127.0.0.1:6333/collections/demo_group_20261019/points/query/groups' -H 'Content-Type: application/json' -d '{"query":[1,0],"group_by":"document_id","limit":2,"group_size":1,"with_payload":true}'`. Ищите `result.groups`: ожидаются группы с `id: "a"` (хит ID 1) и `id: "b"` (хит ID 3); поле `hits` содержит найденные точки группы. Здесь `limit` означает **число групп**, а `group_size` — максимальное число точек внутри одной группы. [s1](#src-s1) [s5](#src-s5)

## Что проверить и когда это не подойдёт?

Сверьте `document_id` и ID найденной точки в каждой группе. Если обе первые группы относятся к одному документу или ответ пуст, проверьте, что поле `document_id` записано при загрузке каждой точки, запрос идёт в учебную коллекцию, а сервер поддерживает этот API. Поле группировки должно быть строковым или числовым; многозначное поле может включить одну точку в несколько групп, поэтому для результата «один документ — одна группа» используйте одиночный ID. `limit` и `group_size` — предельные, **не гарантированные** числа результатов: подходящих точек может быть меньше. [s1](#src-s1) [s5](#src-s5)

Группировка не проверяет права доступа к документам. Если записи разных пользователей хранятся в одной коллекции, сначала ограничьте выборку допустимыми точками через [фильтр по метаданным](/zhurnal/qdrant-filtry-metadannyh/), а разграничение доступа проверяйте отдельно. Если сервер отвечает ошибкой подключения, проверьте его запуск на `127.0.0.1:6333`; не открывайте порт в интернет ради примера. Этот гайд проверяет форму поискового ответа, но **не** качество смыслового поиска, реальный вывод модели или производительность Qdrant. [s1](#src-s1) [s2](#src-s2)

## Источники

1. [Qdrant — Query point groups, API v1.19.x](https://api.qdrant.tech/v-1-19-x/api-reference/search/query-points-groups.md) — получено 2026-10-19
2. [Qdrant — Query points, API v1.19.x](https://api.qdrant.tech/v-1-19-x/api-reference/search/query-points.md) — получено 2026-10-19
3. [Qdrant — Create collection, API v1.19.x](https://api.qdrant.tech/v-1-19-x/api-reference/collections/create-collection.md) — получено 2026-10-19
4. [Qdrant — Upsert points, API v1.19.x](https://api.qdrant.tech/v-1-19-x/api-reference/points/upsert-points.md) — получено 2026-10-19
5. [Qdrant — Search documentation, Grouping API](https://qdrant.tech/documentation/search/search/#grouping-api) — получено 2026-10-19
