Перейти к содержимому

API: Полнотекстовый поиск

Требуется авторизация. Результаты фильтруются по правам пользователя на ресурс.

ПараметрОписание
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 выполняет полную переиндексацию (очистка 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=…