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