Всем привет! На связи Геворг, техлид фронтенд направления Work Solutions. Сегодня расскажу про интеграцию поисковых сервисов Meilisearch и Elasticsearch в Strapi.
Strapi — это популярная Headless CMS для разработки серверов, а также создания гибких API. Однако, встроенные средства поиска могут быть ограничены. Разработчики могут искать способы интеграции с внешними поисковыми системами. Две такие системы — Meilisearch и Elasticsearch. Они предоставляют возможность реализации полноценного поиска в проектах.
В статье рассмотрим, как интегрировать эти системы, сравним их особенности, определим, для каких задач подходят. Примеры рассматриваются для strapi v3. Однако информация также актуальна для v4 с некоторыми незначительными различиями в интерфейсах взаимодействия.
Встроенные механизмы поиска
Начнем со встроенных инструментов для поиска. Для этой цели в Strapi доступен Query Engine API, который дает возможность формировать запросы с различными фильтрами. Запрос организуется следующим образом:

Здесь param представляет собой имя свойства, а filter — один из ключевых операторов для сравнения.
Метод query также поддерживает операторы AND и OR. Оператор AND работает неявно, требует передачи массива с необходимыми условиями:

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

Пример реализации
Для поиска статей в корпоративном блоге, добавим условия поиска по автору, заголовку и тексту анонса. Кроме того, также применим фильтрацию по категориям. Это реализуется без особых трудностей, так как разработчики учли подобные сценарии использования.
Поиск осуществляется по одному из следующий критериев:
Заголовок содержит ключевое слово. Категория статьи соответствует выбранному фильтру.
Текст анонса содержит ключевое слово. Категория статьи с��ответствует выбранному фильтру.
Имя или фамилия автора содержит ключевое слово. Категория статьи соответствует выбранному фильтру.
Опишем параметры запроса, соответствующие этим условиям:

Обратите внимание, что интерфейс запроса позволяет работать с вложенными свойствами, такими как name и surname объекта author.
Познакомились со встроенными возможностями поиска. Если говорим о привычных функциях поисковых сервисов, таких как: исправление опечаток, выделение совпадений, поиск по синонимам и т.п., то встроенный функционал strapi становится недостаточно. Для реализации полноценного функционала поиска можно воспользоваться сторонними сервисами, такими как Meilisearch и Elasticsearch, рассмотрим их детальнее.
Meilisearch
Meilisearch помогает быстро добавлять мощный поиск в проект. Имеет высокую степень настройки из коробки.
Предобработка сущностей
Meilisearch проводит поиск совпадений во всех полях по умолчанию. Включает как публичные, так и приватные атрибуты. Но есть возможность настроить процесс индексации. Для этого нужно использовать метод transformEntry, который позволяет кастомизировать сущность. Например, можно исключить приватные атрибуты из процесса индексации с помощью встроенной функции sanitizeEntity:

Кастомизация поиска
После индексации коллекции, нужно настроить процесс поиска в файле /api/COLLECTION/models/COLLECTION.js. Настройки включают следую��ие свойства:
searchableAttributes– список полей для поиска.synonyms– синонимы для значений поиска.stopWords– список слов, которые следует игнорировать при поиске.typoTolerance– правила опечаток.rankingRules– правила ранжирования.displayedAttributes– поля, которые будут включены в ответ на запрос.
Эти параметры позволяют настроить, как система будет искать и возвращать результаты.

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

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

Meilisearch - отличное решение для оперативного поиска в небольших объемах данных. Однако, если требуется распределенная поисковая система, то Meilisearch может оказаться не наилучшим выбором. Кроме того, сервис не предоставляет инструменты для статического анализа и визуализации данных.
Elasticsearch
Elasticsearch - это мощный движок для поиска и анализа данных, который может быть интегрирован в Strapi. Предоставляет множество функций, но требует сложной настройки.
Рассмотрим, как осуществляется интеграция Elasticsearch:
Индексация
Для интеграции с Elasticsearch, нужно проиндексировать данные для поиска. Для этого подготовим два скрипта. Скрипт первый:

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

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

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

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

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

Сравнительная таблица решений
Рассмотрим сравнительную таблицу между 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. Изучили процессы предобработки данных, настройки параметров поиска, интеграции с клиентами, сравнили функциональность и огра��ичения этих решений. Эта информация поможет разработчикам выбрать наилучший инструмент для своих проектов, а также улучшить опыт пользователей при поиске информации в их приложениях.
