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

UC-CTL-002. Поиск по названию проекта (FTS: name / address / developer)

Назначение

Пользователь ищет проекты по названию, адресу или девелоперу через поле поиска ленты. Каталог выполняет полнотекстовый поиск по витрине CatalogProjectCard с учётом русской морфологии и возвращает карточки, отсортированные по релевантности, тем же контрактом, что лента UC-CTL-001. Текст запроса записывается в user-activity как действие SearchPerformed (ADR-0054); каталог собственную историю поиска не хранит.

Metadata

ПолеЗначение
IDUC-CTL-002
Контекстcatalog (см. docs/06-services/catalog/)
Типосновной
Статусdraft

Актор

ПолеЗначение
РольГость (с реф-cookie) / Инвестор / Агент / Девелопер / МенеджерПИН
Permissions / scopeкак UC-CTL-001: гейт ленты (JWT или реф-cookie); permissions не требуются
Tenantне применяется — платформенная витрина (ADR-0052 п.3)
Record-levelне применяется — только Status = Published

Предусловие

  • Выполняются предусловия UC-CTL-001 (витрина наполнена, гейт пройден).
  • Лента открыта (UC-CTL-001) — поиск уточняет текущую выдачу.

Триггер

ПолеЗначение
ИсточникUI input
Триггерящий элементПоле поиска ленты /lots / /hotels; Enter или кнопка поиска

Основной Поток

  1. Пользователь вводит текст — название проекта, адрес или девелопера — и нажимает Enter/кнопку поиска.
  2. Интерфейс добавляет searchTerm в URL-параметры (шаринг ссылки на выдачу) и запрашивает ленту проектов с этим поисковым запросом (тот же контракт, что UC-CTL-001; поиск комбинируется с фильтрами UC-CTL-003 и сортировкой UC-CTL-004).
  3. Каталог выполняет поиск:
    • Проверка входа. searchTerm после trim — 2..128 символов, иначе ValidationError (400). Гейт ленты — иначе CATALOG_FEED_GATE_REQUIRED (401).
    • Поиск. Полнотекстовый поиск по карточкам Status = Published с учётом русской морфологии; ищется по полям название, адрес и имя девелопера (Name + Address + DeveloperName — дом catalog-project-card.md). По умолчанию порядок — по релевантности; при явной сортировке пользователя (UC-CTL-004) релевантность заменяется её ключами.
    • Состав карточек и гостевое маскирование цен/статусов — как UC-CTL-001.
    • Результат. Список карточек, отсортированный по релевантности, с курсором пагинации.
  4. Интерфейс заменяет ленту результатами поиска.
  5. Пагинация результатов — как UC-CTL-001 (keyset-cursor сохраняет searchTerm).
  6. Интерфейс отправляет событие поиска в user-activity: действие SearchPerformed с текстом запроса и идентификатором сессии/анонимной сессии. Дом истории действий — user-activity (ADR-0054), каталог собственную историю поиска не хранит; события действий пробрасываются в карточку лида (crm) и служат входом персонализации.
  7. Пользователь очищает запрос крестиком/удалением текста — интерфейс убирает searchTerm из URL и повторяет запрос: выдача возвращается к ленте UC-CTL-001.

Альтернативные Потоки

A1. Ничего не найдено

  1. Шаг 3 возвращает 0 результатов.
  2. Интерфейс показывает empty-state «По запросу ничего не найдено» с кнопкой сброса; событие SearchPerformed в user-activity отправляется всё равно (нулевые выдачи ценны для анализа). Возврат к шагу 1 или 7.

A2. Слишком короткий запрос

  1. Интерфейс не отправляет запрос при searchTerm короче 2 символов (debounce + минимальная длина); каталог дублирует правило валидацией (400).
  2. Возврат к шагу 1.

A3. Поиск в ленте объектов недвижимости /lots

  1. Тот же сценарий для ленты объектов недвижимости /lots: полнотекстовый поиск по карточке объекта (Title + Number + Address + DeveloperNamecatalog-property-object-card.md); ответ — карточки объектов недвижимости.
  2. Остальные шаги идентичны; завершается как основной поток.

A4. Поисковый индекс недоступен или отстаёт

  1. Полнотекстовый поиск обслуживает Elasticsearch-проекция (../search/projects.md, ADR-0059) — витрина каталога источник её данных. При недоступности индекса каталог деградирует: отдаёт признак «поиск временно недоступен», интерфейс предлагает вернуться к ленте без текстового запроса (фильтры/сортировка по витрине продолжают работать). Возврат к шагу 7.
  2. Только что опубликованный проект становится находимым после доезда ProjectCardRecomputedEvent и индексации (секунды–минуты); скрытый — перестаёт находиться в том же окне. В интервале отставания выдача помечается признаком свежести. Поток не меняется.

Постусловие

  • Лента заменена результатами поиска, отсортированными по релевантности (или явной сортировке).
  • В user-activity создан ActionEvent (SearchPerformed) с текстом запроса и сессией.
  • Состояние каталога не изменилось (read-only).

Возможные Ошибки

КодHTTPУсловиеПоведение клиента
ValidationError400searchTerm после trim < 2 или > 128 символовПодсветить поле, не слать запрос до исправления
CATALOG_FEED_GATE_REQUIRED401Гейт ленты не пройденAuth-модалка (UC-CTL-001 A1)

Kafka Интеграционные События

СобытиеTopicКогда публикуетсяConsumers
ActionEventRecorded (производит user-activity)pin.user-activity.actions.v1после приёма события поиска (шаг 6)crm (карточка лида), будущие рекомендации news

Acceptance Criteria

#КритерийПроверка
AC1Поиск находит проект по каждому из полей: название, адрес, имя девелоператри запроса по трём полям одного проекта
AC2Морфология русского языка: «морской» находит «море»тест словоформ
AC3Дефолтный порядок — по релевантности; при явной сортировке пользователя релевантность заменяется её ключамисравнение выдач с sort и без
AC4Hidden/Delisted карточки не находятся поискомскрыть проект → пропадает из выдачи
AC5Гостевое маскирование действует и в поисковой выдачезапрос гостем с реф-cookie
AC6Поисковый запрос фиксируется ActionEvent (SearchPerformed) в user-activity, каталог историю не хранитпроверка записи в user-activity + отсутствие таблиц истории в схеме catalog
AC7searchTerm живёт в URL — открытие скопированной ссылки воспроизводит выдачуe2e-тест шаринга
AC8Поиск обслуживает Elasticsearch-проекция; при недоступности индекса — деградация (сообщение + лента без текста), выдача не падает 500тест с выключенным индексом
AC9Только что опубликованная карточка находится поиском лишь после индексации *CardRecomputedEvent (окно свежести), а не мгновеннотест лага проекции

Обратные ссылки

Автоссылки: где используется этот документ.

Связанные Документы

  • API метод: ../api/public/get-projects.md, ../api/public/get-property-objects.md.
  • Domain entity: ../domain/catalog-project-card.md, ../domain/catalog-property-object-card.md (поля поиска).
  • События действий: ../../user-activity/domain/action-event.md (дом ActionEvent, ADR-0054).
  • Связанные UC: UC-CTL-001 (лента), UC-CTL-003 (фильтры комбинируются с поиском), UC-CTL-004 (сортировка результатов).