Эффективный поиск с Elasticsearch.
Swan Hellenic – это британская компания, специализирующаяся на организации круизов класса люкс в культурно-исторически значимых местах по всему миру. Основанная в 1950 году, компания в настоящее время предлагает круизы на трех кораблях — Minerva, Vega и Diana — с комфортабельными номерами, отличным сервисом и экскурсиями, проводимыми опытными гидами. Swan Hellenic уделяет большое внимание культурному и историческому контексту каждого места, которое посещают их пассажиры, и предоставляет возможность полностью погрузиться в местную культуру и традиции.
Ранее мы писали о проекте Swan Hellenic. В этой статье мы расскажем об улучшении пользовательского опыта путём переработки поиска и добавления новых функциональных особенностей к нему.
Старый поиск работал, но был не эффективен: он искал четко по названиям круизов, кораблей и портов так, как пользователь написал, без исправлений и подсказок. Нашей задачей стало улучшение взаимодействия конечного пользователя с каталогом круизов и поиском по нему.
-
Повысить конверсию через поиск. Чем более релевантные ему результаты получит пользователь, тем вероятнее он станет покупателем.
-
Улучшить пользовательский опыт. Сделать процесс поиска более быстрым, точным и интуитивно понятным.
-
Лучше понимать пользователя. Корректируя его опечатки или автоматически понимая, что он имел ввиду, на основе прошлой статистики запросов.
Пространство для маневров
Начиная рассматривать задачи, мы выбирали между несколькими вариантами реализации:
- Использовать самописную систему на PHP, возможно используя Redis или подобные кэширующие технологии
- Найти стороннее решение, которое умело бы “из коробки” то, что нам нужно.
Использовать самописную систему на PHP, возможно используя Redis или подобные кэширующие технологии Найти стороннее решение, которое умело бы “из коробки” то, что нам нужно.
Elasticsearch
Первым же делом мы рассмотрели ElasticSearch.
Elasticsearch — это мощный и гибкий поисковый движок, который используется для поиска и анализа больших объемов данных. Являясь стандартом индустрии, эта технология используется множеством разработчиков и имеет широко развитую экосистему.
Основные преимущества ElasticSearch:
-
Быстрый и эффективный поиск: используются оптимизированные алгоритмы поиска, что позволяет ему обрабатывать большие объемы данных и находить результаты быстро и эффективно.
-
Гибкость: ElasticSearch может быть легко настроен для работы с различными типами данных и системами.
Распределенная архитектура: технология может быть масштабирована на множество узлов и позволяет обрабатывать большие объемы данных с высокой скоростью.
Полнотекстовый поиск: мы можем производить поиск по различным языкам и учитывать множество факторов, таких как релевантность, синонимы, опечатки и так далее.
Возможность анализа данных: ElasticSearch позволяет производить анализ больших объемов данных и предоставляет множество инструментов для визуализации и анализа данных.
Открытый и бесплатный: Инструмент доступен для бесплатного скачивания и использования, так как он является Open Source проектом.
Учитывая все эти особенности, а также наличие в команде специалистов, которые уже работали с этой технологией, мы решили использовать его в нашем проекте.
Реализация поиска
Для достижения целей мы выделили два вектора:
- Автокомплит — список подсказок пользователю при вводе поискового запроса в окне поиска
- Конечный поиск по круизам, когда пользователь уже нажал Enter и перешел на страницу поиска
В качестве подсказок пользователю мы решили использовать ключевую информацию: название круиза, имя корабля у круиза, порт отправления и порт завершения круиза. Каждую ночь мы запускаем процесс переиндексации актуальных на данный момент круизов, создаём новую базу названий и прочего. Таким образом пользователю всегда будут предлагаться актуальные отправления.
Однако иногда мы можем заранее знать, чего хочет пользователь в данный момент, основываясь на статистике. Так, если сейчас наиболее “горячий круиз” — это “Льды арктики”, мы ожидаем, что многие пользователи будут искать именно его, начиная вводить “Льды”. Учитывая это, мы ввели также глобальную историю и статистику поиска. Теперь человеку будут предлагаться сначала наиболее искомые релевантные запросы.
Конечный поиск по круизу должен немного думать за пользователя, исправляя его ошибки и понимая его намерения. Так, если пользователь допустит ошибки в поисковой фразе, или же напишет название приблизительно, в результаты поиска попадут все круизы, которые мог иметь в виду пользователь. Для этого мы осуществляет поиск по проиндексированным круизам и берем оттуда все релевантные.
-
Недостаточно гибкий инструментарий. Для Symfony существует библиотека, призванная упростить работу с ElasticSearch, но на деле она оказывается недостаточно гибкой для решения наших задач. Поэтому в нашей реализации мы использовали библиотеку для “чистого” PHP, что привело нас к необходимости в проработке собственной архитектуры поискового модуля.
-
Моментальные поисковые подсказки. Когда пользователь вводит поисковую фразу, он должен видеть возможные результаты сразу после каждого введенного символа. Для этого мы минимизировали обработку на бекенде, и возложили эту работу практически полностью на ElasticSearch, в котором есть необходимые структуры и алгоритмы поиска, наиболее оптимальные для создания подсказок на лету.
Многоязычность. Сайт переведен на разные языки, круизы и прочие объекты в системе имеют собственные переводы на многие языки. Пользователю мы должны выводить контент на его языке. Поэтому ещё мы доработали индексацию и уточнили поиск: теперь он учитывает регион пользователя, и результаты у него будут переведенными.