Интеграция Поиска в 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, который дает возможность формировать запросы с различными фильтрами. Запрос организуется следующим образом:

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

Источник: https://habr.com/ru/articles/791414/


Интересные статьи

Интересные статьи

Всем привет! Это моя первая статья на Хабре и в ней я хочу рассказать о том, как мы можем интегрировать Elasticsearch в наше Spring Boot приложение. Этот проект предназначен для ознакомления с техноло...
Долгожданный релиз UNIGINE 2.17 SDK состоялся! В него вошло множество возможностей и новый функционал, над которыми мы работали последние несколько месяцев. О самом важном и интересном - под катом.
Приложение.ВведениеЭмодзи — это своеобразный картиночный язык, это набор смыслов, выраженных с помощью визуальных образов.За каждым эмодзи стоит определённое его значение. Примеры — можно посмотреть в...
Первое упоминание термина “maze” датируется тринадцатым веком, а “labyrinth” — к четырнадцатым. Сама концепция лабиринтов восходит к эпохе греческого мифологического героя Тесея — древнего героя, успе...
В 2021 году рынок IT — и, в частности, рынок инженеров, которые позиционируют себя как DevOps, — остается перегретым, и пока нет тенденции к его охлаждению. Спрос на спец...