search.md 6.6 KB

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

Не используется.

Назад