---
metadata:
  - name: generator
    content: Diplodoc Platform v5.56.0
alternate:
  - https://ydb.tech/docs/en/concepts/query_execution/hybrid_search.md?version=main
  - https://ydb.tech/docs/ru/concepts/query_execution/hybrid_search.md?version=main
  - href: ru/concepts/query_execution/hybrid_search.md
    type: text/markdown
    title: Markdown version
  - href: ../../llms.txt
    type: text/markdown
    title: llms.txt
sourcePath: ru/core/concepts/query_execution/hybrid_search.md
---
> **Documentation Index:** Fetch the complete configuration index at https://ydb.tech/docs/ru/llms.txt

# Гибридный поиск

## Понятие гибридного поиска

**Гибридный поиск** объединяет [полнотекстовый поиск](https://ydb.tech/docs/ru/concepts/query_execution/fulltext_search.md?version=main) и [векторный поиск](https://ydb.tech/docs/ru/concepts/query_execution/vector_search.md?version=main) в едином ранжированном результате. Вместо выбора одного из сигналов гибридный запрос оценивает каждый документ сразу по двум критериям — насколько его текст соответствует запросу (лексическая релевантность) и насколько его эмбеддинг близок к вектору запроса (семантическая близость) — а затем **объединяет** два ранжирования в одно.

Эти сигналы дополняют друг друга:

* **Полнотекстовый поиск** ([BM25](https://en.wikipedia.org/wiki/Okapi_BM25)) точен для конкретных термов, имён, кодов и редких ключевых слов, но пропускает документы, в которых использованы другие формулировки.
* **Векторный поиск** (поиск ближайших соседей по эмбеддингам) улавливает семантическую близость и перефразирования, но может поставить тематически близкий документ выше того, который содержит точный введённый пользователем терм.

Их объединение даёт результаты, релевантные одновременно и лексически, и семантически. Это распространённый строительный блок для поиска по базам знаний и для этапа извлечения данных в подходе Retrieval-Augmented Generation (RAG).

## Гибридный поиск в YDB {#hybrid-search-ydb}

В YDB гибридный запрос выполняется по таблице, для которой созданы **оба** индекса:

* [fulltext_relevance](https://ydb.tech/docs/ru/dev/fulltext-indexes.md?version=main#relevance) по текстовой колонке;
* [vector_kmeans_tree](https://ydb.tech/docs/ru/dev/vector-indexes.md?version=main) по колонке с эмбеддингами.

Объединение задаётся в секции `ORDER BY` функцией `HybridRank`, которая принимает по одному оценивающему выражению на каждую ветвь — [FullTextScore](https://ydb.tech/docs/ru/yql/reference/builtins/fulltext.md?version=main#fulltext-score) для текстовой ветви и [Knn](https://ydb.tech/docs/ru/yql/reference/udf/list/knn.md?version=main)-расстояние или сходство для векторной ветви:

```yql
$queryText = "машинное обучение";
$queryVector = Knn::ToBinaryStringFloat([0.1, 0.2, 0.3, 0.4]);

SELECT id, title
FROM documents
ORDER BY HybridRank(
    FullTextScore(text, $queryText),
    Knn::CosineDistance(embedding, $queryVector))
LIMIT 10;
```

Каждая ветвь выполняется по своему индексу и возвращает собственный список наиболее подходящих документов. Затем YDB объединяет эти списки в итоговое ранжирование — одним из двух способов:

* **Reciprocal Rank Fusion (RRF)** — по умолчанию. Каждая ветвь вносит вклад на основе *ранга* документа в этой ветви, поэтому абсолютные значения оценок (которые несопоставимы между ветвями) не имеют значения.
* **Linear** — взвешенная сумма оценок ветвей (по умолчанию нормализованных методом min-max).

Веса ветвей, константа RRF и размеры пулов кандидатов настраиваются. Полный синтаксис запроса и список параметров — в разделе [Гибридный поиск (HybridRank)](https://ydb.tech/docs/ru/yql/reference/syntax/select/hybrid_search.md?version=main).

Подробнее:

* [Использование гибридного поиска](https://ydb.tech/docs/ru/dev/hybrid-search.md?version=main)
* [Синтаксис гибридного запроса (HybridRank)](https://ydb.tech/docs/ru/yql/reference/syntax/select/hybrid_search.md?version=main)
* [Полнотекстовый поиск](https://ydb.tech/docs/ru/concepts/query_execution/fulltext_search.md?version=main)
* [Векторный поиск](https://ydb.tech/docs/ru/concepts/query_execution/vector_search.md?version=main)
