# SearchService ## Назначение SearchService отвечает за индексацию текстовых данных (товары, категории и др.) и быстрый полнотекстовый поиск по ключевым словам. Его задача - по входному запросу вернуть набор идентификаторов товаров максимально быстро, с учётом синонимов, опечаток и типичных ошибок написания. Контроль доступа - через сессию (NBSession). ## Публичные методы ### Синонимы, опечатки, ошибки написания * `SetSynonymsAsync(pairs: KeywordPair[]): void` - установить список пар синонимов. * `GetSynonymsAsync(): KeywordPair[]` - получить актуальный словарь синонимов (например, «шпатлевка → шпаклевка»). * `SetTyposAsync(pairs: KeywordPair[]): void` - задать перечень типовых опечаток (символьные замены). Этот список критичен к производительности, его нельзя раздувать. * `GetTyposAsync(): KeywordPair[]` - вернуть текущие опечатки (например, «о→а», «с→cc»). * `SetMisspellingsAsync(pairs: KeywordPair[]): void` - задать список ошибок написания целых слов. Дубли уже покрытых «typos» не включаются. * `GetMisspellingsAsync(): KeywordPair[]` - вернуть словарь ошибок написания (например, «ломинат → ламинат»). ### Индексация и поиск * `FeedAsync(feeds: FeedPackage[]): void` - передать пакеты данных для индексации (источник, тип, ключевые поля/фразы, метка времени). * `SearchProductsIds(query: string, filters: QueryFilter[], sortType: QuerySortTypeEnum): int[]` - выполнить поиск и вернуть идентификаторы товаров, соответствующих запросу и фильтрам, в указанном порядке сортировки. ## Как устроен поиск (высокоуровнево) 1. **Нормализация запроса**: приводим строку к канонической форме; применяем словари `synonyms`, `typos`, `misspellings` (слово-замены и символьные замены). Это расширяет «поле находок» без дублирования. 2. **Сопоставление с индексом**: для каждой сущности, поданной через `FeedAsync`, в индексе хранятся «ключевые слова» и поля («Keywords»). По ним и производится быстрый матч. 3. **Применение фильтров**: дополнительно ограничиваем результат по `QueryFilter` (категория, бренд, «в наличии» и типовые атрибуты), см. ниже. 4. **Сортировка**: порядок задаётся параметром `sortType` (тип перечисления определён в контракте `QuerySortTypeEnum`). ## Фильтры (QueryFilter) `QueryFilter` состоит из `FilterTypeId` и набора `Values`. По умолчанию `FilterTypeId` - это **идентификатор типа атрибута товара**, но предусмотрены специальные значения от 2 000 000 000 и выше: ``` FILTER_CATEGORY = 2_000_000_000 // фильтр по категории FILTER_IN_STOCK = 2_000_000_001 // фильтр "в наличии" FILTER_BRAND = 2_000_000_002 // фильтр по бренду ``` Значения `Values` интерпретируются в контексте типа фильтра (набор id категорий/брендов, булевы значения и т. п.). ## Модели (используемые сервисом) ### `KeywordPair` ``` string Source //исходная форма (что искать/заменять) string Target //целевая форма (на что заменять/добавлять в поиск) ``` Используется в словарях: `synonyms`, `typos`, `misspellings`. ### `FeedPackage` ``` long Id //идентификатор пакета int SourceId //идентификатор источника (например, товара/категории) string SourceType //тип источника (строка вместо enum для независимости и сериализации) string[] Keywords //ключевые слова/фразы для индексации long Timestamp //Unix timestamp (секунды) ``` Пакеты формируют/обновляют индекс; тип хранится строкой для упрощения сериализации и ослабления связности. ### `QueryFilter` ``` int FilterTypeId //тип фильтра: id типа атрибута либо специальные константы (см. выше) string[] Values //значения фильтра (строки) ``` Фильтры комбинируются: итоговая выдача - пересечение условий. ## Эксплуатационные заметки * **Производительность:** список `typos` - самый чувствительный ко времени отклика; держите его минимальным и осмысленным. * **Качество поиска:** словари `synonyms` и `misspellings` повышают полноту, но добавляют ветвления - поддерживайте их в актуальном состоянии и избегайте «шумных» правил. * **Согласованность с каталогом:** `DirectoryService` обновляем словари в момент получения обновления своей базы и момент первоначальной загрузки. * **Доступ:** операции выполняются от имени текущей сессии; результаты могут в дальнейшем пересекаться с правами публикации/видимости на стороне каталога. ## DB Не используется. [Назад](/index.md)