Как улучшить поиск в интернет магазине с помощью Elasticsearch

Если Вы до сих пор используете MySQL или другую реляционную базу данных для поиска на своем интернет магазине, то Вам определенно стоит прочитать эту статью. В ней я расскажу что такое Elasticsearch и каким образом он может повысить лояльность пользователей и потенциально увеличить продажи. Заинтригованы? Тогда продолжаем.

Данная статья не о том как Elasticsearch работает под капотом, а о том какие возможности у него есть и как он может помочь Вам сделать правильное решение и мигрировать с MySQL при построении системы поиска для Вашего интернет магазина.

Сценарий

Представьте что у Вас есть интернет магазин и Вы используете MySQL в качестве поискового движка на этом сайте. Ваши посетители могут искать товары по категории, цене, бренду, заголовку и описанию. Более того, Вы тратите приличные деньги на рекламу, у Вас много посетителей, но, по каким-то причинам Вы зарабатываете гораздо меньше чем планировали или хотели бы. В чем может быть причина? Возможно посетители просто не могут найти товары, которые они ищут, даже при том, что эти товары есть у Вас на сайте и Вы их действительно продаете. Что?!

Давайте проанализируем в каких областях MySQL хорош и что он может предоставить нам для удовлетворения потребностей наших потенциальных клиентов.

Использование MySQL для полнотекстового поиска

Не смотря на то, что MySQL имеет специальные функции для полнотекстового поиска, тем не менее он был разработан для выполнения совсем других задач — стркутурированного поиска. Если Вы уже используете или только планируете использовать MySQL для полнотекстового поиска, то Вам стоит знать его достоинства и недостатки.

Достоинства

— Хороший структурированный поиск

Под структурированным поиском люди обычно понимают поиск по данным с четкой структурой. К примеру по цене, дате, возрасту, размеру и т.д. Если данные имеют четкую структуру, то мы можем применить логические операции к ним. Например:

Покажи мне ноутбуки Dell, с ценой в диапазоне от 1000 до 3000, которые были выпущены в 2015 году

Еще один пример поиска:

Мониторы с экраном от 23 дюймов

У структурированного поиска булева логика. Он отвечает на поврос «Подходит товар под поисковый запрос или нет?» Товар должен подходить по всем критериям или же он будет отфильтрован при поиске и исключен из результатов.

— Полнотекстовый поиск по словам (с релевантностью)

Используя MySQL довольно легко искать товары по отдельным словам, не фразам целиком. К примеру товары в нашей базе имеют следующие заголовки:

— обеденный стол и стулья

— Ikea деревянный обеденный стол с 4 стульями

— Маленький обеденный стол квадратной формы  на 2 человека. Сделан из цельного дерева

— Черный обеденный стол с 2 деревянными стульями

а пользователь ищет:

деревянный обеденный стол

Если мы выполним его запрос используя `match against` в MySQL (поиск по набору слов), то мы получим следующие результаты:

— Ikea деревянный обеденный стол с 4 стульями

— обеденный стол и стулья

— Маленький обеденный стол квадратной формы  на 2 человека. Сделан из цельного дерева

— Черный обеденный стол с 2 деревянными стульями

`Match against` воспринимает нашу фразу как 3 отдельных, несвязанных между собой слова. Соответственно при поиске игнорируется порядок слов и не требуется наличие всех трех слов. На основе количества найденных слов и других параметров каждому товару выставляется бал релевантности. Такой тип поиска отвечает на другой вопрос — «На сколько товары подходят под запрос пользователя?»

— Бесплатный

MySQL имеет бесплатную версию (community edition), которая является бесплатной, так что Вы сможете использовать ее в своих проектах без дополнительных затрат.

Недостатки

— Ограниченный поиск по фразам

Как мы уже разобрались, MySQL поддерживает полнотекстовый поиск на основе набора слов, выводя результаты в соответствии с их релевантностью. Что если нам необходимо найти товары, которые полностью совпадают с нашей фразой как единым цлым? MySQL не предоставляет подобных решений из коробки. Да, Вы конечно же можете использовать функционал регулярных выражений, но это будет весьма ограниченное и неэффективное решение.

— Не имеет подстветки результатов поиска, подсказок к поиску, размытого поиска, автоматических правок слов при поиске, мощных поисковых фильтров

Хммм, кажется что MySQL не поддерживает довольно внушительный набор интересного функционала. Что же мы будем делать? Все просто — будем использовать Elasticsearch.

Используем Elasticsearch для поиска

Elasticsearch предоставляет наиболее мощные возможности для полтнотекстового поиска, которые доступны в проектах с открытым исходным кодом. Более того, он используется очень крупными игроками рынка. Facebook, Microsoft, Cisco, Uber, The New York Times, Mozilla, eBay, Goldman Sachs — все они используют Elasticsearch. Если это так и такое количество компаний его используют, то в его качестве и надежности можно не сомневаться и мы обязательно должны его испытать.

Давайте пройдемся по вышеупомянутым недостаткам MySQL и посмотрим может ли Elasticsearch устранить их и если да, то как именно.

Достоинства

— Полнотекстовый поиск по фразам

В Elasticsearch такой поиск работает из коробки. Он также поддерживает модификаторы, которые знакомы нам с поиска в Google, например: + (плюс) — слово должно присутствовать и  (минус) — слово должно отсутствовать. Что еще хорошо — по умолчанию результаты будут отсортированы в соответствии с релевантностью текста к запросу. Во многих случаях это именно то что нужно.

— Мощные поисковые фильтры

Любой язык и его правила довольно сложные. В любом языке можно выделить так называемы стоп слова — маленькие вспомогательные слова, которые не имеет большой смысловой нагрузки. В русском языке это могут быть союзы, как например `и`, `или`, `а`. Если мы подумаем еще немного, то вспомним про синонимы и т.д. В ходе рассуждений мы можем прийти к тому, что различные формы и числа слова объединяет корень. Да, правил и нюансов действительно много. Как нам лучше понимать наших клиентов? Что именно они ищут и что для них важно, а что второстепенно? Все эти нюансы языка могут быть настроены в Elasticsearch. Небольшой пример:

Пользователь ищет

столы

и в нашей базе у нас по прежнему следующие товары:

— обеденный стол и стулья

— Ikea деревянный обеденный стол с 4 стульями

— Маленький обеденный стол квадратной формы  на 2 человека. Сделан из цельного дерева

— Черный обеденный стол с 2 деревянными стульями

Если бы мы использовали `match against` в MySQL, то получили бы ноль товаров в результате. Это может показаться странным, возможно даже сбить с толку. Почему MySQL возвращает пустоту? Все просто. Для MySQL слова `столы` и `стол` — это два совершенно разных слова. Как раз такую проблему легко решить с помощью Elasticsearch. Оба эти слова имеют общий корень — `стол`. Если мы применим фильтр, который сокращает слова до корня, то пользователь увидит четыре товара вместо ноля. Отлично, как раз то что нужно! Elasticsearch предоставляет широкий набор подобных фильтров, я лишь показал Вам верхушку айсберга.

— Подстветка результатов

Пользователи любят когда искомые слова подсвечиваются в результатах поиска. Это особенно важно когда они ищут среди тысяч товаров, каждый из которых имеет свое описание. Ниже приведу пару хороших на мой взгляд примеров использования подсветки в реальных проектах:

The New York Times:

Google:

 

Facebook:

 

Как Вы можете видеть, для пользователя не составит труда найти в куче текста именно то что он искал.

— Подсказки к поиску

Хочу упомянуть еще одну важную возможность Elasticsearch — подсказки. Вы 100% их уже видели, вспомните Google и его надпись «Возможно Вы имели в виду». Время от времени пользователи делают опечатки или просто не знают как правильно написать название товара. С MySQL пользователь увидел бы пустую страницу, но с Elasticsearch мы можем показать пользователю, что что-то пошло не так. Более того, мы можем подсказать ему как именно стоит искать то что ему нужно. Пара примеров с реальных проектов:

Amazon:

Google:

 

Youtube:

 

Зачем крупные сайты делают это? Потому что для них это дополнительная возможность не потерять клиента, провести его за руку к его цели. К примеру, на Amazon’е пользователь увидит эту подсказку, кликнет по ней и в результате увидит товары, в которых он действительно был заинтересован. Шансы на то, что он совершит покупку возрастают. Используя этот простой прием мы помогаем нашим пользователям совершать покупки.

— Размытый поиск

Данный тип поиска использует сходство строк основанное на расстоянии Левенштейна. На самом деле тут нет ничего сложного. Под расстоянием подразумевается количество изменений, которое необходимо применить к строке, чтобы она стала идентична исходной. В нашем случае исходная строка — это поисковый запрос пользователя. Рассмотрим на примере. Пользователь хочет найти

ноутбук lenovo

но делает опечатку:

ноутбук lenovp

Если бы мы использовали поиск через MySQL, то пользователь увидел бы 0 товаров. Да, это плохо, мы только что потеряли клиента. Данную проблему можно решить с помощью Elasticsearch и `fuziness`. К примеру, мы настраиваем поиск и указываем `fuziness` как 1, т.е. все строки, к которым необходимо применить только одну правку, чтобы они были равны поисковому запросу нам подходят. И снова все отлично. Здорово? Еще бы!

— Автодополнение

Хорошо, теперь мы знакомы с множеством полезных возможностей Elasticsearch. Мы знаем как помочь пользователю если он допустил ошибки, как показать ему правильный вариант, направить его. Неплохо, верно? Да, но мы можем лучше! Мы можем предотвращать ошибки вместо того, чтобы исправлять их последствия. Для такого случая у Elasticsearch припасен еще один туз в рукаве — атодополнение. Представим такую ситуацию: пользователь начинает набирать слово, успевает ввести лишь пару букв и вот он уже видит возможные варианты в выпадающем списке. Более того, ему даже не надо печатать запрос до конца т.к. он может просто выбрать один из предложенных вариантов. Если пользователь видит и выбирает вместо того, чтобы догадываться и печатать, то он не совершит опечатки вообще. Благодаря автодополнению мы имеем две важные вещи:

1) Мы убираем этот неловкий момент, этот шаг с фразой «Извините, Вы сделали ошибку. Возможны Вы имели в виду…» — тем самым делая опыт работы пользователя с интернет магазином еще лучше.

2) Пользователь может достучаться до своего желанного товара на один шаг быстрее. Это очень важно.

Если Вы спросите меня кто использует автодополнение, то я отвечу что десятки, сотни и тысячи сайтов им пользуются. Вот лишь несколько из них:

eBay:

 

Amazon:

 

Google:

 

— Бесплатный

Вам повезло, т.к. Elasticsearch не обойдется Вам ни копейки. Вы можете использовать его в любых проектах бесплатно.

Вывод

Если у Вас есть интернет магазин где Вам необходим только структурированный поиск по категории, бренду, цене, году и т.д., то MySQL Вам вполне подойдет. Если же у Вас очень много товаров с длинными заголовками и описаниями, то Вам необходим гораздо более гибкий и мощный инструмент. Это значит, что Вам стоит использовать Elasticsearch для таких случаев. Все достоинства Elasticsearch, которые я описал в данной статье нацелены на то, чтобы помочь пользователям легко найти то что они ищут. Чем легче клиенту будет найти товар используя полнотекстовый поиск, тем больше вероятность покупки. Думаю это именно то, что Вам нужно.