API: Полнотекстовый поиск
Требуется авторизация. Результаты фильтруются по правам пользователя на ресурс.
GET /api/v1/search
Заголовок раздела «GET /api/v1/search»| Параметр | Описание |
|---|---|
q | Строка поиска (минимум 2 символа, максимум 200) |
limit | Макс. результатов (1–50, по умолчанию 30) |
Запрос обрабатывается через PostgreSQL FTS (simple) с префиксным сопоставлением токенов (например, очень находит очень1) и дополнительным ILIKE по title/body для подстрок.
Пример:
curl "http://localhost/api/v1/search?q=задачи" \ -H "Authorization: Bearer $TOKEN"Ответ:
{ "success": true, "data": [ { "resourceType": "list", "resourceId": "uuid", "nodeId": "uuid", "title": "Задачи", "snippet": "…текст из полей элемента…", "url": "/lists/zadachi", "rank": 0.12 } ], "meta": { "query": "задачи" }}Типы resourceType: user, node, list, list_item, page, library, library_file. Пользователи ищутся по активным учётным записям (не через portal_search_index).
Индексация
Заголовок раздела «Индексация»Инкремент при изменениях
Заголовок раздела «Инкремент при изменениях»При создании, изменении и удалении контента индекс обновляется сразу в том же запросе:
| Событие | Действие |
|---|---|
| Создание / изменение узла, страницы, элемента списка, файла | upsert одной записи |
| Удаление / уход в корзину | удаление из индекса |
| Восстановление из корзины | повторная индексация |
| Выключение «Участвует в поиске» у списка/библиотеки | удаление всего контента из индекса |
| Включение флага | индексация списка/библиотеки и содержимого |
Ошибки индексации логируются и не откатывают сохранение контента.
Списки и библиотеки с search_enabled = false (и их элементы/файлы) в глобальный поиск не попадают. Настройка: Настройки списка/библиотеки → Общие → Участвует в поиске (по умолчанию включено). API: PATCH с searchEnabled — только portal_admin.
Полный обход (search-crawler)
Заголовок раздела «Полный обход (search-crawler)»Служба search-crawler выполняет полную переиндексацию (очистка portal_search_index + обход узлов, списков с search_enabled, страниц, библиотек и текстовых файлов). Это сверка на случай пропущенных хуков, а не основной путь обновления.
Индексируется:
- узлы (title, description);
- списки и элементы (если
search_enabled); - страницы (HTML → текст);
- библиотеки и файлы (имя + текстовое содержимое для
text/*, JSON, XML; лимит размера текста).
Ручной полный обход: Админка → Службы → «Поисковый индекс» → ▶ (полный обход). Job type: searchCrawler.run.
Очистка без обхода: там же иконка метлы («Очистить индекс»), либо:
POST /api/v1/admin/search/clearТолько portal_admin. После очистки новые изменения снова попадут в индекс при сохранении; для полной сверки запустите полный обход.
Расписание: по умолчанию ежедневно в 03:00 (миграция 047); настройка в Службы → Расписание.
Индекс хранится в PostgreSQL (portal_search_index, GIN + tsvector).
Поле поиска в верхней панели → /search?q=…