Если вы когда-либо использовали Firebase Database для сортировки и обработки данных, вы знаете, что Firebase API относительно ограничен для поисковых запросов. Есть всего несколько способов сортировки:

  • orderByChild (), orderByKey (), orderByValue ()

и фильтрация данных:

  • limitToFirst (), limitToLast (), startAt (), endAt (), equalTo ()

Для небольших проектов этого может быть достаточно, но когда дело дошло до крупных приложений электронной коммерции, мы быстро поняли, что Firebase Database API определенно будет недостаточно.

В случае с интернет-магазином, например, мы хотели сгруппировать некоторые продукты и найти самые дорогие из них, или сделать нумерацию страниц, или найти товары из какой-то внутренней категории. Это невозможно сделать без кладжей с использованием стандартного Firebase Database API.

Мы начали искать решения, как улучшить поисковые запросы, и нашли замечательную программу под названием Firebase Flashlight от theFirebase team. Это библиотека адаптера для ElasticSearch. С помощью этого сценария вы работаете с Firebase Realtime Database, используя ElasticSearch Query DSL. Он позволяет создавать мощные запросы с агрегациями, подстановочными знаками (например, produc? - *) и регулярными выражениями.

Необязательно использовать ElasticSearch для всех запросов. Вы можете использовать простой Firebase Realtime Database API для большинства из них и ElasticSearch для более сложных случаев использования.

Прежде всего, давайте поговорим об архитектуре Firebase Flashlight и о том, как она меняет способ использования Firebase Realtime Database.

Фонарик под капотом

Firebase Flashlight - это скрипт, который связывает ElasticSearch с Firebase Realtime Database. При запуске индексирует Firebase Database. Затем Flashlight ожидает входящих запросов в сегменте search/request. Когда приходит запрос, он немедленно обрабатывает его и возвращает ответ данных в корзину search/response. Любые обновления в Firebase Database отслеживаются Flashlight в режиме реального времени.

Вы можете начать думать, что хранение всех запросов в Firebase переполняет нашу базу данных ненужной информацией. Firebase Flashlight заботится об этом cleaning processed queries каждую минуту или время, указанное в config.

Чтобы использовать Flashlight, у вас должен быть локально запущенный сценарий (для разработки) или он работает на каком-то сервере. Сервер Heroku с сервисом Бонсай - хороший выбор. Но в производстве мы запускаем Flashlight в Docker container из-за его масштабируемости и производительности.

Вся конфигурация Flashlight хранится как файл config.example.js. Вам нужно только настроить файл учетной записи службы и маршрутизацию, и вы готовы использовать Firebase Flashlight в своем проекте:

Также вы должны указать пути, которые будут индексироваться Flashlight. Например, вы не хотите индексировать платежную информацию, заказы и другую секретную информацию. Для этого добавьте конфигурацию в массив paths ваших корзин без путей, которые вы не хотите индексировать:

На клиенте вы можете использовать этот метод для запроса данных из Firebase Realtime Database:

Если вы новичок в ElasticSearch Query DSL, проверьте это краткое руководство.

А теперь мы хотели бы рассказать вам о некоторых случаях, когда нам помогал ElasticSearch. ElasticSearch с Firebase использовались в наших angular-commerce компонентах.

Пагинация

Есть разные способы разбивки на страницы для веб-приложений. Используя ElasticSearch Query DSL, вы можете сделать это с помощью всего одного запроса. Например, мы хотим показать в нашем интернет-магазине список продуктов с разбивкой на страницы. Чтобы показать продукты с определенной страницы, передайте номер текущей страницы (page) и количество выходных продуктов (size). Запрос будет выглядеть так:

Чтобы запросить данные, вызовите метод requestData:

Товары из определенной категории

Предположим, товары разделены на категории. Как вы находите товары из определенной категории? Это очень легко:

Фильтрация товаров по атрибутам

Давайте еще больше расширим нашу продукцию. У товаров есть атрибуты. Что нам делать, если мы хотим отфильтровать товары по этим атрибутам? Например, фильтрация товаров по красному цвету и среднему размеру будет выглядеть так:

Агрегации ценностей

Очень популярно фильтровать товары по их цене с помощью ползунка следующего типа:

Но как получить максимальную и минимальную цену на продукцию?

Решить эту проблему помогут запросы агрегации:

Этот запрос вернет максимальную и минимальную цену в определенной категории.

Фильтрация товаров по цене

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

Заключение

Итак, ElasticSearch Query DSL улучшает поисковые способности Firebase Realtime Database. Например, в проектах электронной коммерции рекомендуется комбинировать ElasticSearch с Firebase Database. Это дает вам больше свободы в построении запросов и производительности поиска. Если у вас возникнут проблемы с настройкой Firebase Flashlight, обращайтесь к нам.