Новости

Алгоритм поиска

Для поиска в b2b-системе используется Elasticsearch.
Подробнее об Эластике в Википедии.
Почему именно он? Аргументы от экспертов

1. Индексация данных о товарах

Вся информация о товарах, загружаемая в b2b-систему, разбивается в поисковом индексе на поля (название товара, артикул, синонимы и др.), а те в свою очередь разбиваются на токены.
Под словом «токен» (token) обычно понимают слово или часть слова отделенную с двух сторон:

  • пробелами
  • либо разделителями (-,/, +, |)
  • либо сменой цифр на буквы
  • либо сменой русских букв на английские
Помимо основных полей (название товара, артикул, синонимы и др.), автоматически создаются дополнительные виртуальные поля. Они нужны, чтобы обработать различные сценарии поиска.

Пример виртуальных полей для основного поля "Название":

Чтобы посмотреть как товар разбился на токены: Панель админки - Каталог - Товары - Просмотр товара (глазик) - Вкладка "Токены"
Если товар не ищется, значит в нем НЕТ ТАКОГО ТОКЕНА! Что делать в таком случае?

2. Разбиение поискового запроса на токены

Все поисковые запросы (то, что пользователь вбивает в строку поиска) также разбиваются на токены. Аналогичным образом что и при индексации.
Пример разбиения запросов на токены:
"кабельный канал" —> 2 токена: кабельный + канал
"кабель-канал" —> 2 токена: кабель + канал
"кабельканал" —> 1 токен: кабельканал
"CM010610HDZ" —> 3 токена: CM + 010610 + HDZ
"ввг нг (A) ls" —> 4 токена: ввг + нг + а +ls
"ввгнглс" —> 1 токен: ввгнглс
"ввгнгls" —> 2 токена: ввгнг + ls
Пример разбиения слова на токены:
"кабель" —> кабель
"кабель" —> кабел
"кабель" —>кабе
"кабель" —> каб
Такое разбиение начинаем делать с 3 символа сначала и до 10 символа включительно.
Пример:
"клещ токоизм" - будет искать токоизмерительные клещи

"клещ токоизмерительн" - не будет искать, так как обрезаны после 10 символа

3. Полнотекстовый поиск

Поиск осуществляется несколькими запросами (блоками), разделяемыми логическим ИЛИ.

В каждом блоке поиск ведется по разным наборам полей (виртуальных) и разным типом разбиения поисковой фразы на токены.

Чтобы товар попал в выдачу все токены из поисковой фразы должны совпасть в любом блоке. Если нет хотя бы одного совпадения по одному из блоков, то товар не попадет в выдачу.

Некоторые блоки подключаются, если выполняется некоторое условие. Например если поиск ведется только по одному слову.

  • Блок 1. Поиск по полям с разбивкой на токены с помощь пробелов (фильтры + русская морфология)
  • Блок 2. Поиск по полям с разбивкой на слова (world_delimiter)
  • Блок 3. Поиск по идентификаторам (артикул, код производителя и т.д).
  • Блок 4. Нечеткий поиск для запроса от 6 символов с расстоянием Левенштейна = 1. Условие - если пользователь ввел более 6 символов.
  • Блок 5. Поиск по части целочисленного кода. Условие - если пользователь ввел одно слово, состоящее из более чем 4 цифр.
  • Блок 5. Поиск с учетом ошибочной раскладки клавиатуры. Условие - если поисковая фраза отличается от фразы после корректировки раскладки клавиатуры (рус. → анг., анг. → рус.).
Поиск