Комментарии
И подсказки дает. И ошибки исправляет. А ваш поиск так умеет? Рассказываем, с какими поисковыми движками мы работали, и помогаем сделать правильный выбор
Слишком умный для поиска
Сибирикс
Слишком умный для поиска
И подсказки дает. И ошибки исправляет. А ваш поиск так умеет? Рассказываем, с какими поисковыми движками мы работали, и помогаем сделать правильный выбор
Промахнуться мимо клавиши — дело нехитрое, даже если ты крепкий, розовощекий малый с давлением 120/80 и регулярным стулом. А уж если у тебя температура под 39, мигрень, зубная боль, ушиб и ожог (ничего себе, сходил за хлебушком), риск опечататься стремится к бесконечности. Как и риск забыть все правила русского языка разом. Как и риск не поменять раскладку. Ну, вы поняли.

И вот такой несчастный заходит на какой-нибудь аптечный маркетплейс и вводит в поиске, конечно, не что иное, как «пороцитомол».
А Вселенная спит и ухом не ведет. Кроме, разве что, этих 23 168 аптек, которые хлопают сейчас глазами и недоумевают: «Ого, это мы, что, только что 19 рублей потеряли?» Или сколько там стоит парацетамол, не суть. Ага, потеряли. И, видимо, теряете ежедневно, по 19, 50, 230, 680, 1700 рублей за каждый криворукий ввод, хоть эти руки и не настолько кривы, чтобы не суметь перечислить любую из этих сумм на ваш расчетный счет.

Вот почему, когда мы разрабатывали «Проаптеку», решили, что неплохо, если поисковик на сайте будет распознавать ошибки в словах и подсказывать запросы. Типа, а-а-а, так ты, наверное, парацетамол ищешь? Ну, что ж ты сразу не сказал. Вот же он, вот.
А еще классно, когда поисковик может поиграть с тобой в «Далеко-далеко».

Ты ему:
— Па!

Он:
— …нтенол?
— …ниум биорал?
— …рацетамол?
Sphinx

Штатный поиск Битрикса сам по себе так не умеет. Зато Битрикс можно интегрировать со Sphinx’ом. Для этого нужно:

  • установить Sphinx на сервер и настроить его,
  • в админке сайта переключить поисковый движок на Sphinx,
  • вставить в Sphinx кусок конфига,

и в идеальном мире все заведется! В нашем — зачастую приходится поколдовать еще над тонкостями настройки. А чтобы передать Sphinx’у контент на индексацию, жмем в админке на «переиндексировать». И вот все данные уже загружаются в Sphinx. Дальше начинается магия.

1
Sphinx не идет с козырей и сначала ведет себя так же, как все поисковые движки — дробит каждое название товара по пробелам и составляет словарь, в который попадает не одна строка из пяти слов, а пять строк из одного слова.

Было:
парацетамол таб 500 мг № 20 (Renewal)

Стало:
парацетамол
таб
500 мг
№ 20
(Renewal)

2
А вот тут он уже начинает умничать и для каждого слова генерирует набор триграмм (3 последовательно идущих символа).

Было:
парацетамол
таб
500 мг
№ 20
(Renewal)

Стало:
'парацетамол', ' __п, _па, пар, ара, рац, аце, цет, ета, там, амо, мол, ол_, л__',
'таб', '__т, __аб, таб, аб_, б__'
'500', '__5, _50, 500, _00, __0'
'мг', '__м, _мг, мг_, г__'
'№ 20', '__№, _№ 2, № 20, 20_, 0__'
'(Renewal)', __(, _(R, (Re, Ren, ene, new, ewa, wal, al_, l__'

3
Сфинкс индексирует триграммы.

Было:
какой-нибудь 'цет'

Стало:
какой-нибудь ID 0100

Этот ID занимает определенное положение и в парацетамоле, и в цетрине, и в пирацетаме, и в ацетилсалициловой кислоте.



4
Когда пользователь вводит слово в поиске, для него тоже строятся триграммы.

'порацетамол', ' __п, _по, пор, ара, рац, аце, цет, ета, там, амо, мол, ол_, л__',
'пароцетамол', ' __п, _па, пар, аро, роц, аце, цет, ета, там, амо, мол, ол_, л__',
'пароцитамол', ' __п, _па, пар, аро, роц, аци, цит, ета, там, амо, мол, ол_, л__',
'пароцетомол', ' __п, _па, пар, аро, роц, аце, цет, ето, том, амо, мол, ол_, л__',
'пороцитамол', ' __п, _по, пор, оро, роц, оци, цит, ита, там, амо, мол, ол_, л__'.

5
Введенное в поиске слово по триграммам сопоставляется с собранной в Sphinx’е базой индексов.

Выясняется, что у пороцитамола с порталаком 3 совпадения, с дипиридамолом — 4, а с парацетамолом — 6.

6
Sphinx ранжирует варианты и выдает лучшее исправление. Это исправление, у которого:

  • Совпало наибольшее количество триграмм (тут парацетамол уверенно вырывается вперед и оставляет далеко позади себя порталак и дипиридамол).

  • Длина слова не отличается или отличается на минимальное количество символов, по сравнению с остальными вариантами (дипиридамол вдруг снова обретает надежду, а порталак окончательно сходит с дистанции).

  • Самая высокая частота вхождений в проиндексированные тексты сайта (парацетамол — 261 раз, а дипиридамол — 11, кажется, у нас есть победитель).

7
По варианту-победителю Sphinx начинает поиск загруженных в его базу данных ID документов и передает Битриксу те из них, в которых есть «парацетомол». И по этим ID Битрикс из своей базы уже достаёт реальные карточки товаров.

8
Sphinx ранжирует все результаты по релевантности, учитывая вхождение запроса в проиндексированные поля. Если слово «парацетамол» входит в заголовок товара, это самый высокий ранг и такой товар будет вверху выдачи, если в описание товара — это второстепенный фактор и такой товар будет внизу выдачи.

Подсказки результатов строятся по тому же принципу, только в фоновом режиме. Когда пользователь вводит запрос на сайте и делает паузу после нажатия клавиши в середине слова, этот запрос отправляется в Sphinx, и Sphinx проделывает всю ту же работу. Разве что ищет не только полные вхождения введенной части слова, но и все слова, которые начинаются так же.
Штатный поиск Битрикса
Штатный поиск Битрикса выполняет такой же первый шаг, как и Sphinx, а вот дальше приводит все слова в начальную форму и сохраняет их в базе данных. Строится таблица всех начальных форм слов, раз. Строится таблица всех текстов, два. Строится связывающая таблица, которая показывает, что вот это слово встречается вот в этом тексте на такой-то позиции, три. Что не строится — не строятся триграммы. Соответственно, Битрикс не умеет исправлять ошибки. Максимум, что он может — различать окончания слов. У битриксового поиска есть специальная настройка — учитывать/ не учитывать морфологию.

Если морфология учитывается, поиск идет по формам слова. Вводишь «парацетомола» (типа, парацетамола мне!), а тебе предлагается и «парацетомолом», и «парацетомолу», и «парацетомоле» — выбирай на свой вкус. Одно, но — нельзя искать по части слова, так что если введешь «пара», получишь не парацетомол, а «паре», «пару», «парой».

Если морфология не учитывается, Битрикс ищет только по полному точному вхождению. Парацетамол и все тут. А свои царские замашки с «парацетамола мне» отставить. Зато можно искать по части слова. Вводишь параце — находится парацетамол.

Для сайтов, написанных не на Битриксе, а на какой-то другой CMS-ке, надо смотреть, с каким поиском она нативно интегрируется. Если сайт на фреймворке — опять же, искать наиболее популярные модули. Для фреймворков, как правило, больше дополнительных модулей, чем для CMS'ок.
Elasticsearch
К слову сказать, Sphinx занимает только пятую строчку в рейтинге DB-Engines на июль 2019-го. А абсолютный лидер рейтинга уже не первый месяц подряд — Elasticsearch.
Из топ 5 этого рейтинга открытый исходный код — у Elasticsearch, Solr и Sphinx. Все эти поисковые решения — достойные конкуренты друг другу. Они поддерживаются сообществом авторов и могут похвастаться высокой производительностью, масштабируемостью и гибкостью. Хотя, конечно, у каждого свои особенности.

С Solr мы не работали. А Elastic Search использовали на Амулексе. В первую очередь, потому что он нативно интегрируется c Laravel. В Elasticsearch, как минимум, более сложная (богатая) система условий в поисковых запросах, чем в Sphinx. Elastic'ом занимается большая команда разработчиков, поэтому он быстрее развивается и всегда свеженький-новенький.

Но с настройками Elastic'а могут возникнуть проблемы, так что нужно учитывать, что он требует большей квалификации. У него много всяких наворотов, вроде визуализации и анализа данных, машинного обучения, возможности индексации документов без указания схемы, но он жрет непомерно много памяти.

Наше ощущение — если нужны общие функции поиска и не нужны никакие дополнительные фичи, лучше использовать Sphinx. Если же нужны метрики и аналитика и предполагается работать с неструктурированными данными (DOC, PDF, MP3 и т. д.), лучше использовать Elasticsearch.
Яндекс.Спеллер
Для одного из проектов рассматривали также Яндекс.Поиск, но отмели его, потому что он работает, во-первых, только по проиндексированным Яндексом страницам, а во-вторых, там копирайт Яндекса. А вот Яндекс.Спеллер прижился на Portobello. Если нужен совсем простой вариант по исправлению ошибок на сайте, возможно, вам подойдет этот сервис.

Яндекс.Спеллер находит ошибки текста, сравнивая слова со своей базой правильных слов. Эта база содержит самый большой в Рунете словарь русского языка — 3,6 млн словоформ. Когда поиск Битрикса ничего не находит по запросу на сайте, запрос по api передается в Яндекс.Спеллер. Яндекс.Спеллер поясняет, что это, оказывается, был не еджедыневник, а ежедневник, и поиск Битрикса тут же выдает 100 500 товаров.

Со своими задачами сервис справляется, но, конечно, это совсем не аналог Sphinx и Elastic Search. Да и работает медленнее.

Кстати, пара наших клиентов в свое время покупали поисковые сервера от Гугла. Это, в первую очередь, ЖЕЛЕЗКА — коробочное решение Google Search Appliance (GSA). Оно разрабатывалось для внутрикорпоративного поиска. Сейчас Гугл не продает новые лицензии на GSA.
Умные вопросы для выбора умного поиска
Сами поисковые движки — это адово сложная штука. Если лезть в их код, чтобы разобраться, как это все работает, можно себе мозг сломать. Даже человеку, недалекому от программирования. Никто свои поисковые движки для сайтов не пишет. Никогда. Кроме тех, кто их уже написал однажды и погряз в этом навек. Все остальные используют уже готовые.

Есть несколько широко распространенных поисковых движков, таких как Elasticsearch и Sphinx. Их можно найти в мировых обзорах и рейтингах. На youtube можно посмотреть выступления их разработчиков на крупных IT-мероприятиях. Среди их клиентов — компании с мировыми именами. У этих движков открытый исходный код и грамотные технические документации.

И есть малоизвестные поисковые движки, про которые очень сложно найти адекватную информацию, на сайтах которых всегда все расплывчато-красиво и непонятно. Зато они активно написывают интернет-магазинам, рассылают яркие презентации с анализом поиска и предлагают свой сервис. Наши клиенты с этим встречались не раз.

Мы изучаем их презентации и отправляем подобный список вопросов. И каждый раз не получаем ничего в ответ. Вопросы приводим — возможно, они помогут вам однажды сделать правильный выбор и не ввязаться в сомнительную аферу.
1. Какие именно данные и каким образом передаются с сайта в вашу систему? Где они хранятся? Интересуют вопросы безопасности.

  • Список отправляемых параметров и способ отправки данных (если используется шифрование, то какой способ).
  • Территориальное расположение серверов.
  • Гарантии безопасности и конфиденциальности данных (предполагаем, есть стандартные формы документов, которые вы предлагаете к подписанию, где зафиксированы все подобные условия).

2. В списке клиентов у вас представлено достаточно много логотипов компаний. Пожалуйста, уточните, что конкретно выполнялось для нескольких компаний из списка. В идеале — с возможностью посмотреть на результат.

3. На некоторых сайтах из списка клиентов мы не увидели в исходном коде страниц упоминаний вашего встроенного виджета. Подскажите, где именно используется ваш виджет, как посмотреть его в работе на этих сайтах?

4. На нескольких сайтах из списка увидели использование виджета в поисковой строке (всплывающее окно), но не увидели встроенного виджета на странице с результатами поиска (либо выглядит так, что виджет только выводит строку с альтернативными ссылками, но не сами результаты). Из презентации и документации не ясно, как именно ваш виджет влияет на выдачу результатов поиска на отдельной странице с результатами.

  • Насколько поняли, есть влияние на ранжирование, но непонятно, как это стыкуется с выводом дополнительных данных по товарам на сайте на странице выдачи (характеристики, ссылки, кнопки, фильтр)? Что выводит сайт, а что виджет?
  • На каких сайтах используется ваш виджет вывода результатов на странице результатов поиска?
  • Если возможно использование связки виджета и вывода средствами сайта (например, в ответ на отправленный запрос вы возвращаете на сайт в каком-то виде ответ со списком товаров, отранжированный определенным образом) — пришлите документацию на отправляемые данные и формат ответа.

5. Каким образом пополняется и формируется словарь синонимов? Какие именно алгоритмы используются для его формирования?

6. Можете ли отправить описание 1−2 успешных внедрений системы, которые можно посмотреть на текущий момент на работающих сайтах? С указанием, что именно проделано с точки зрения выдачи для пользователя и с технической точки зрения. Поисковая строка, всплывающая подсказка, страница результатов поиска. Что именно в каждом из указанных мест делает виджет, что реализуется на сайте и с виджетом не связано?
Еще в университете, а далее — в аспирантуре я занимался разработкой поисковых движков. Мы носились с идеей нормализации текстов, определения частей речи с помощью флективных типов. Обрабатывали на вторых пентиумах гигабайты текстов, обучая поисковый движок. Пытались работать с семантикой (очень сложная тема). В итоге получили вполне достойно работающую систему. Тысячи строк на C++. Несмотря на то, что к поиску все привыкли (подумаешь, обычное дело) — тема очень многогранная, с кучей тонкостей и подводных камней. Полировать её можно до бесконечности. Однако для большинства нужд веба сейчас самое рациональное — взять Sphinx (или Elasticsearch), настроить его по-максимуму и смириться с его ограничениями.

Владимир
Руководитель студии