Интеграция Поиска в Strapi: Meilisearch vs. Elasticsearch

Всем привет! На связи Геворг, техлид фронтенд направления Work Solutions. Сегодня расскажу про интеграцию поисковых сервисов Meilisearch и Elasticsearch в Strapi.

Strapi — это популярная Headless CMS для разработки серверов, а также создания гибких API. Однако, встроенные средства поиска могут быть ограничены. Разработчики могут искать способы интеграции с внешними поисковыми системами. Две такие системы — Meilisearch и Elasticsearch. Они предоставляют возможность реализации полноценного поиска в проектах.

Подробно сравниваем Meilisearch и Elasticsearch, способы их реализации, демонстрируем ограниченность встроенного поиска в статье корпоративного блога Work Solutions. Там же делимся особенностями реализации поиска в нашем блоге. 

В этой же статье рассмотрим, как интегрировать эти системы, сравним их особенности, определим, для каких задач подходят. Примеры рассматриваются для strapi v3. Однако информация также актуальна для v4 с некоторыми незначительными различиями в интерфейсах взаимодействия.  

Встроенные механизмы поиска

Начнем со встроенных инструментов для поиска. Для этой цели в Strapi доступен Query Engine API, который дает возможность формировать запросы с различными фильтрами. Запрос организуется следующим образом:

8aea01a5bf35a24e69fcebdfb563de18.png

Здесь param представляет собой имя свойства, а filter — один из ключевых операторов для сравнения. 

Метод query также поддерживает операторы AND и OR. Оператор AND работает неявно, требует передачи массива с необходимыми условиями:

b44484f2c4025ffcbcb630962c27a80d.png

Для использования оператора OR, применяется ключевое слово _or:

6deea7bc017230e7a497723c9b2ffd1e.png

Пример реализации

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

Поиск осуществляется по одному из следующий критериев:

  • Заголовок содержит ключевое слово. Категория статьи соответствует выбранному фильтру.

  • Текст анонса содержит ключевое слово. Категория статьи соответствует выбранному фильтру.

  • Имя или фамилия автора содержит ключевое слово. Категория статьи соответствует выбранному фильтру.

Опишем параметры запроса, соответствующие этим условиям:

36dca8442ee74cf52b543655581b9935.png

Обратите внимание, что интерфейс запроса позволяет работать с вложенными свойствами, такими как name и surname объекта author.

Познакомились со встроенными возможностями поиска. Если говорим о привычных функциях поисковых сервисов, таких как: исправление опечаток, выделение совпадений, поиск по синонимам и т.п., то встроенный функционал strapi становится недостаточно. Для реализации полноценного функционала поиска можно воспользоваться сторонними сервисами, такими как Meilisearch и Elasticsearch, рассмотрим их детальнее.

Meilisearch

Meilisearch помогает быстро добавлять мощный поиск в проект. Имеет высокую степень настройки из коробки. 

Предобработка сущностей

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

df2ed14faa65419da7d6e1619c9f1c08.png

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

После индексации коллекции, нужно настроить процесс поиска в файле /api/COLLECTION/models/COLLECTION.js. Настройки включают следующие свойства:

  1. searchableAttributes — список полей для поиска.

  2. synonyms — синонимы для значений поиска.

  3. stopWords — список слов, которые следует игнорировать при поиске. 

  4. typoTolerance — правила опечаток. 

  5. rankingRules — правила ранжирования.

  6. displayedAttributes — поля, которые будут включены в ответ на запрос.

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

9eb91e74f512454177394f1fb1ba107d.png

Интеграция с клиентом

Для интеграции Meilisearch с клиентским приложением, можно использовать npm-пакет meilisearch. Вот как возможно инициализировать клиента и осуществить поиск:

7f340a5f19ac93303be28d3b37a5dafe.png

Для поиска статей, связанных со strapi, с возможностью выделения совпадений и упорядочивания по дате публикации, можно использовать следующий запрос:

fe95b70366a3e9beffa571bb6b9d2ee0.png

Meilisearch — отличное решение для оперативного поиска в небольших объемах данных. Однако, если требуется распределенная поисковая система, то Meilisearch может оказаться не наилучшим выбором. Кроме того, сервис не предоставляет инструменты для статического анализа и визуализации данных.

Elasticsearch

Elasticsearch — это мощный движок для поиска и анализа данных, который может быть интегрирован в Strapi. Предоставляет множество функций, но требует сложной настройки.

Рассмотрим, как осуществляется интеграция Elasticsearch:

Индексация

Для интеграции с Elasticsearch, нужно проиндексировать данные для поиска. Для этого подготовим два скрипта. Скрипт первый:  

803b8cdb53b056111d16de91a17b2672.png

Скрипт второй:

813dd4c478b24867472c3a67f08534d4.png

Создание API

Для создания API в Strapi, необходимо добавить новый роут, а также контроллер для обработки запросов. Для начала добавим новый роут:

1734212572d679309e01d5f0c9b24ccd.png

Следующий шаг — создать контроллер для обработки запросов. Для этого расширим информацию в файле controllers/articles.js:

1fbdc1e1ce919a27cb9148989bb2c9c1.png

Реализуем логику поиска в services/articles.js:

b37a6c7075bdb7ef71a1ea861937174a.png

Интеграция с клиентом

Для интеграции с клиентским приложением, обращаемся к контрольной точке поиска, которую создали ранее. Например, с использованием библиотеки Axios:

491eddcbcd865647790a1702db8cb8af.png

Сравнительная таблица решений

Рассмотрим сравнительную таблицу между Strapi, Meilisearch и Elasticsearch, которая описывает их возможности и ограничения:

Возможности

Strapi

Meilisearch

Elasticsearch

Распределенная работа

Нет

Нет

Да

Простота интеграции со Strapi

Да

Нет

Простота синтаксиса запросов

Да

Да

Нет

Ограничения в поисковых запросах

Сложно

Не более 10 слов в запросе

Нет

Добавление синонимов

Нет

Да

Да

Выделение совпадений

Нет

Да

Да

Поиск неточных соответствий

Нет

Да

Да

Ограничения индексации

Максимум 200 индексов. Не более 100 слов в поле

Нет

Выбор оптимального решения

Выбор между Strapi Query Engine API, Meilisearch и Elasticsearch зависит от ваших конкретных задач, а также требований:

— Query Engine API: Подойдет для фильтрации данных, либо простых поисковых запросов. Но если речь идет о поисковом сервисе, то лучше выбрать готовые решения.

— Meilisearch: Отлично подходит для быстрого поиска по небольшим объемам данных. Легок в освоении, предоставляет множество возможностей для настройки.

— Elasticsearch: Идеально подходит для обработки больших объемов данных, сложных запросов, распределенных систем. Тем не менее, требует значительно больше ресурсов, а также более сложной конфигурации.

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

Заключение

В этой статье мы рассмотрели различные способы интеграции систем поиска, таких как Meilisearch и Elasticsearch, с Headless CMS Strapi. Изучили процессы предобработки данных, настройки параметров поиска, интеграции с клиентами, сравнили функциональность и ограничения этих решений. Эта информация поможет разработчикам выбрать наилучший инструмент для своих проектов, а также улучшить опыт пользователей при поиске информации в их приложениях.

© Habrahabr.ru