Поиск
DocPlatform включает встроенный полнотекстовый поисковый движок (Bleve), который автоматически индексирует весь контент. Не нужно настраивать внешний сервис — поиск работает сразу после установки.
Использование поиска
Диалог Cmd+K
Нажмите Cmd+K (macOS) или Ctrl+K (Windows/Linux) в любом месте веб-редактора, чтобы открыть диалог поиска.
┌──────────────────────────────────────────┐
│ 🔍 Search documentation... │
├──────────────────────────────────────────┤
│ │
│ 📄 Getting Started │
│ Install and configure DocPlatform... │
│ │
│ 📄 API Authentication │
│ JWT tokens, OAuth2, and session... │
│ │
│ 📄 Docker Deployment │
│ Run DocPlatform as a container... │
│ │
│ ↑↓ Navigate ↵ Open Esc Close │
└──────────────────────────────────────────┘
Что индексируется
Поисковый движок индексирует:
- Заголовок страницы (повышенный вес для ранжирования)
- Описание страницы (повышенный вес)
- Полный контент страницы (основной текст, блоки кода, списки и т.д.)
- Теги (точное совпадение с повышенным весом)
- Метаданные frontmatter
Синтаксис поиска
| Синтаксис | Пример | Описание |
|---|---|---|
| Ключевые слова | git sync |
Страницы, содержащие и “git”, и “sync” |
| Точная фраза | "bidirectional sync" |
Страницы с точной фразой |
| Префикс | auth* |
Страницы со словами, начинающимися на “auth” |
| Фильтр по тегу | tag:api |
Страницы с тегом “api” |
Фильтрация по правам доступа
Результаты поиска автоматически фильтруются на основе прав текущего пользователя:
- Публичные страницы — видимы в результатах поиска для всех аутентифицированных пользователей
- Страницы workspace — видимы только участникам workspace
- Ограниченные страницы — видимы только пользователям с необходимой ролью
Viewer не может найти ограниченные admin-only страницы через поиск, даже если контент соответствует запросу. Эта фильтрация происходит на уровне поискового движка, а не после выполнения запроса.
Индексация
Автоматическая индексация
Контент индексируется инкрементально через асинхронную очередь задач:
- Страница создана или обновлена (через редактор или синхронизацию git)
- Content Ledger генерирует событие
- Задача поисковой индексации ставится в очередь
- Индексатор Bleve обрабатывает задачу и обновляет индекс
Между сохранением страницы и появлением обновленного контента в результатах поиска проходит небольшая задержка (обычно менее 1 секунды).
Перестроение поискового индекса
Если поисковый индекс рассинхронизировался (редкость — обычно после сбоя или ручной манипуляции с файлами), перестройте его:
docplatform rebuild
Это удаляет существующий поисковый индекс и переиндексирует все страницы из файловой системы. Процесс выполняется в фоне — сервер остается доступным во время перестроения.
Состояние индекса
Проверьте состояние поискового индекса с помощью команды doctor:
docplatform doctor
Команда doctor сообщает:
- Количество индексированных документов по сравнению с количеством страниц в базе данных
- Осиротевшие записи индекса (проиндексированы, но нет соответствующей страницы)
- Отсутствующие записи индекса (страница существует, но не проиндексирована)
- Размер файла индекса и временная метка последнего обновления
Поиск в опубликованной документации
Опубликованные сайты документации включают интерфейс поиска для посетителей. Поле поиска отображается в заголовке сайта и использует тот же движок Bleve.
Поиск на публичном сайте ограничен только опубликованными страницами — неопубликованный или ограниченный контент никогда не отображается в публичных результатах поиска.
Внутреннее устройство поискового движка
Для пользователей, которые хотят понять, как работает поиск:
Анализатор
Bleve использует English analyzer по умолчанию, который включает:
- Токенизация — разделение текста по пробелам и знакам препинания
- Приведение к нижнему регистру — поиск без учета регистра
- Удаление стоп-слов — фильтрация распространенных слов (the, is, at и т.д.)
- Стемминг — соответствие вариантам слов (running -> run, documented -> document)
Веса полей
Не все поля имеют одинаковый вес в оценке релевантности:
| Поле | Вес | Описание |
|---|---|---|
title |
Высокий | Заголовок страницы (наиболее релевантный сигнал) |
description |
Высокий | Описание / краткое содержание страницы |
tags |
Точное совпадение | Ключевое поле — повышенный вес для точных совпадений тегов |
body |
Обычный | Полный контент страницы |
path |
Ключевое | Путь к файлу — только точное совпадение |
Это означает, что запрос, соответствующий заголовку страницы, ранжируется выше, чем тот же запрос, найденный глубоко в основном тексте.
Хранилище
Индекс Bleve хранится в {DATA_DIR}/search-index/ с использованием bbolt (чистая Go-реализация B+ tree базы данных). Индекс отделен от базы данных SQLite и может быть безопасно удален и перестроен с помощью docplatform rebuild.
Производительность
| Метрика | Значение |
|---|---|
| Задержка запроса | < 8 мс (p99) |
| Размер индекса | ~1 КБ на страницу (приблизительно) |
| Максимальный протестированный корпус | 1 000 страниц |
| Параллельные запросы | Поддерживаются (потокобезопасно) |
| Задержка индексации | < 1 секунды после сохранения (асинхронно) |
Производительность поиска масштабируется линейно с объемом контента. Для workspaces, превышающих 10 000 страниц, в будущих версиях будет предложена опциональная интеграция с Meilisearch.