Полнотекстовый поиск в Rails приложении средствами Elasticsearch

Дата публикации:

Elasticsearch — это open-source поисковый и аналитический движок, построенный на библиотеке Apache Lucene. Он обеспечивает масштабируемый, простой и надежный инструмент для поиска, позволяющий индексировать и запрашивать большие объемы структурированных данных. Elasticsearch имеет удобную RESTful API и отличается легкой интеграцией в Rails приложения (благодаря сторонним гемам).

На сегодня Elasticsearch является одним из самых надежных, быстрых и мощных поисковых движков. Кроме того, он активно поддерживается компанией Elastic, что можно назвать отдельным и вполне самодостаточным преимуществом.

Создаем простое приложение

Итак, первоначальная задача поставлена. Нам нужно простое Rails приложение, в котором мы сможем создавать объекты, а в дальнейшем — производить по ним поиск.

Генерируем новое Rails приложение:

Теперь нам нужна модель для постов в блоге. Ее и генерируем:

Интегрируем Elasticsearch в наш Блог

Далее движемся по намеченному плану. Так как мы уже создали Rails приложение и у нас имеется модель Post, по которой будет производиться поиск, можно приступить к добавлению Elasticsearch.

Разумеется, этот пункт подразумевает наличие Elasticsearch. Вы можете скачать и установить движок с сайта Elastic https://www.elastic.co/downloads/elasticsearch.

Gemfile:

Не забываем запустить  bundle install  для установки этих гемов.

Интегрируем поиск в нашу модель Post

Чтобы интегрировать поиск в нашу модель Post, мы должны добавить основные модули  elasticsearch-model  в  Post  класс.

Изменяем app/models/post.rb:

На текущем этапе мы уже располагаем базовым поиском, который может находить информацию по всем доступным полям. В нашем случае — это  title  и  text . Более того, он умеет находить вхождения целых слов. Однако этого нам недостаточно. Продолжаем работать.

Для начала мы должны создать новый объект пост:

По умолчанию,  elasticsearch-model  добавляет в наш класс  Post  метод  search, который принимает поисковый запрос, а также дополнительные параметры для поиска.

Проверим, как работает поиск и найдем наш пост:

Ситуация следующая — поиск вернул нам массив, содержащий необходимый пост. Однако останавливаться на достигнутом пока рано. Давайте создадим еще один пост, чтобы окончательно убедиться в работоспособности нашего поиска.

Поиск все еще возвращает правильный результат. Как говорится — хорошо, но мало. Теперь мы добавим третий пост и посмотрим, будет ли поиск отрабатывать одновременно по двум полям  title и text без возврата лишнего результата.

Как видите, поиск вернул оба поста, содержащих слово “Awesome”. Причем, в разных полях. Все в порядке.

Кастомизация запроса

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

Elasticsearch предоставляет Query DSL на основе JSON запросов. Что это означает? Существуют основные запросы, такие как term или match. Есть также составные запросы, такие как bool. В этом качестве могут выступать и связанные с ними фильтры. Например,  filtered или constant_score.

Давайте переопределим метод  search  в app/models/post.rb:

Улучшение поиска

Хоть у нас уже и есть рабочий поиск, мы прекрасно понимаем, что совершенство не имеет пределов. Особенно в тех случаях, когда оптимизация просто-таки напрашивается. Вы можете заметить что наш поиск ограничен. Он умеет искать только вхождения целых слов. Например, поиск по слову во множественной форме — “foxes” вместо “fox” — вернет пустой результат. И с этим надо как-то бороться.

К счастью, Elasticsearch предоставляет массу возможностей для улучшения поиска. В частности — кастомизация маппингов.

В зону ответственности маппингов входят:

  • представление документа в поисковом движке;
  • поисковые характеристики, такие как выбор полей и разбор запроса на лексемы.

По умолчанию, маппинги могут не указываться, так как они автоматически создаются при добавлении нового поля в индекс. Они определяются только тогда, когда мы хотим их изменить.

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

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

Добавляем маппинги в нашу модель app/models/post.rb:

В конечном итоге наша модель должна выглядеть так:

Теперь нам нужно заново пересоздать индексы. Туда должны попасть маппинги:

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

Теперь можно создать пост и удостовериться в том, что мы получаем нужный результат:

Как видите, Elasticsearch справился с задачей целиком и полностью.

Заключение

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

Мы Крым Диджитал

С 2015 года мы предоставляем полный цикл услуг мобильной и веб-разработки клиентам из различных отраслей и разных стран.

Подпишись
на наши новости

Контакты пресс-службы

+ 7 (926) 118-80-32

WhatsApp, Viber, Telegram

Давайте обсудим Ваш проект

или свяжитесь с нами по почте projects@crimeadigital.ru

Нажимая кнопку «Отправить», вы даете согласие на обработку персональных данных

Заполните форму или свяжитесь
удобным для Вас способом

Контакты

г. Севастополь, ул. Руднева, д.41, 4 этаж технопарк ИТ-Крым +7 978 679-76-353 agro@crimeadigital.ru

Социальные сети

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

Крым Диджитал приняла участие в стратегической сессии

Руководители Крым Диджитал приняли участие в стратегической сессии, которая прошла на базе СевГУ 10 июня. Вместе с Правительством Севастополя, Институтом информационных технологий и управления в технических системах СевГУ и приглашенными ИТ-компаниями города обсудили перспективу развития системы высшего образования в Севастополе.Представители бизнеса, власти и образовательной системы выступали со своим видением будущих потребностей региона в кадрах, поднимали насущные вопросы обучения студентов, прохождения практики и дальнейшего трудоустройства. Крым Диджитал является амбассадором идеи образования и взращивания молодых кадров, развивает образовательные проекты и на протяжении 5 последних лет ведет активную работу в направлении поддержки и развития молодых специалистов ИТ-отрасли Крыма.

Руководители Крым Диджитал приняли участие в стратегической сессии, которая прошла на базе СевГУ 10 июня.

Вместе с Правительством Севастополя, Институтом информационных технологий и управления в технических системах СевГУ и приглашенными ИТ-компаниями города обсудили перспективу развития системы высшего образования в Севастополе.
Представители бизнеса, власти и образовательной системы выступали со своим видением будущих потребностей региона в кадрах, поднимали насущные вопросы обучения студентов, прохождения практики и дальнейшего трудоустройства.

Крым Диджитал является амбассадором идеи образования и взращивания молодых кадров, развивает образовательные проекты и на протяжении 5 последних лет ведет активную работу в направлении поддержки и развития молодых специалистов ИТ-отрасли Крыма.

Выпуск курса Software Testing

Мы поздравляем выпускников нашего первого в этом году курса Крым Диджитал Академии по Software Testing! Всего курс успешно завершили 13 человек. В течение 2 месяцев несмотря на теплую погоду и манящее море ребята ответственно посещали занятия 2 раза в неделю, делали домашние задания и проверочные работы. Трое начинающих специалистов теперь стажеры нашей компании. Следующий курс намечен на август. Не пропусти анонс записи!

Мы поздравляем выпускников нашего первого в этом году курса Крым Диджитал Академии по Software Testing!

Всего курс успешно завершили 13 человек. В течение 2 месяцев несмотря на теплую погоду и манящее море ребята ответственно посещали занятия 2 раза в неделю, делали домашние задания и проверочные работы. Трое начинающих специалистов теперь стажеры нашей компании.

Следующий курс намечен на август. Не пропусти анонс записи!

Лицензия на образовательную деятельность

В 2022 году мы получили лицензию на образовательную деятельность по программам дополнительного профессионального образования! Теперь мы можем обучать специалистов по направлениям Ruby on Rails, ReactJS и Software Testing и выдавать удостоверения о повышении квалификации государственного образца.
В 2022 году мы получили лицензию на образовательную деятельность по программам дополнительного профессионального образования! Теперь мы можем обучать специалистов по направлениям Ruby on Rails, ReactJS и Software Testing и выдавать удостоверения о повышении квалификации государственного образца.

Мы вошли в Реестр эффективно и социально значимых предприятий.

По результатам ежегодной финансово-экономической аналитики Межотраслевой рейтинговой компании Крым Диджитал включена в Реестр эффективных и социально значимых предприятий. По итогу аналитики, в рамках отрасли (ОКВЭД 62.01) и региона Крым, CDG вошло в 4% лучших компаний страны, с результатом – 92 балла!
По результатам ежегодной финансово-экономической аналитики Межотраслевой рейтинговой компании Крым Диджитал включена в Реестр эффективных и социально значимых предприятий. По итогу аналитики, в рамках отрасли (ОКВЭД 62.01) и региона Крым, CDG вошло в 4% лучших компаний страны, с результатом – 92 балла!