---
title: "Гибридный поиск"
description: "Лексический поиск работает всегда, семантика и граф-буст — опционально; результаты сливаются через RRF, без них поиск остаётся полнотекстовым."
---

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

Поиск в Notarium собран из независимых каналов, которые дополняют друг друга. Полнотекстовый (лексический) поиск доступен всегда и без настройки. Семантический поиск по смыслу и учёт связей графа — опциональные слои поверх него. Результаты каналов сливаются в единый рейтинг, а если опциональные слои недоступны — поиск продолжает работать по полному тексту, без ошибки.

## Три канала

| Канал | Что делает | Когда работает |
|---|---|---|
| Лексический (FTS/BM25) | Находит точные вхождения слов и фраз, ранжирует по BM25 | Всегда, без настройки |
| Семантический (векторы) | Находит близкое по смыслу, даже без общих слов | Опционально (`VECTOR_SEARCH`) |
| Граф-буст | Подтягивает соседей найденного по `[[wiki-ссылкам]]` | Опционально (`GRAPH_BOOST`), по умолчанию выключен |

Лексический канал — основа: он работает сразу после запуска, ничего доустанавливать не нужно. Семантический добавляет понимание смысла (синонимы, перефразировки), граф-буст — знание о связях.

## Как сливаются результаты

Каналы объединяются алгоритмом **RRF** (Reciprocal Rank Fusion, k=60): каждый канал даёт свой ранжированный список, а RRF складывает их в общий рейтинг по позициям, а не по несопоставимым «сырым» оценкам. Так лексическое совпадение и смысловая близость взвешиваются вместе. Слияние идёт на уровне заметки — по её устойчивому идентификатору.

```mermaid
flowchart LR
  q([Запрос]) --> fts[Лексика · FTS/BM25]
  q --> vec[Семантика · векторы]
  q --> gr[Граф · 1-hop]
  fts --> rrf{RRF-слияние}
  vec --> rrf
  gr --> rrf
  rrf --> res([Результаты])
```

## Если семантика недоступна

Семантический слой может быть выключен или недоступен: не включён `VECTOR_SEARCH`, не установлен векторный стек, не загрузилась модель или вычисление вектора запроса не уложилось в таймаут. В любом из этих случаев запрос обслуживается лексическим каналом — поиск отвечает всегда и не выдаёт ошибку из-за отсутствия семантики.

> [!note] Семантика включается по желанию
> Векторный поиск тянет тяжёлый нативный стек (~660 МБ на диске) и загружает модель эмбеддингов в память (сотни МБ RAM), поэтому по умолчанию в публичном образе он выключен. Как его включить и какую модель выбрать — в разделе [Настройка поиска](/docs/self-hosting/search-setup/).

## Где вы ищете

- **Spotlight / OmniSearch** — быстрый ранжированный переход к заметке. Здесь работает полный гибрид: важна релевантность, а не только точное вхождение слова. См. [Поиск и Spotlight](/docs/guides/search-spotlight/).
- **Фильтр ленты** (`?q=` в [Ленте](/docs/guides/feed/)) — это лексический фильтр по корпусу: он оставляет заметки, где термины действительно встречаются, и складывается с фильтрами по папкам, тегам и датам.

## Индекс и его пересборка

Поисковый индекс — производное знание: он строится из файлов и полностью восстановим ресканом. Один индекс на пространство. Смена модели эмбеддингов — это не миграция, а пересборка векторной части с нуля. Первичное построение векторного индекса на большой базе идёт минутами, а то и часами; на это время интерфейс показывает индикатор «Building search index…», а сам поиск остаётся доступным в лексическом режиме.

Смежные темы: [Граф знаний](/docs/concepts/knowledge-graph/) — откуда берётся третий канал, [Настройка поиска](/docs/self-hosting/search-setup/) — включение семантики и выбор тира, [File-first](/docs/concepts/file-first/) — почему индекс восстановим.
