Pull to refresh

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

Level of difficultyEasy
Reading time5 min
Views1.6K

Всем привет! На связи Геворг, техлид фронтенд направления 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. Настройки включают следующие свойства:

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

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

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

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

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

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

Tags:
Hubs:
Total votes 5: ↑4 and ↓1+3
Comments0

Articles