ElasticSearch с использованием PHP-фреймворка Symfony

E

Настоящая статья является введением в серию статей, посвященных теме «Как работать с ElasticSearch с использованием PHP-фреймворка Symfony». Вы можете рассматривать это как учебник по Symfony ElasticSearch, хотя вы также получите дополнительные глубокие знания о том, как создавать поисковый микросервис с нуля, как использовать шаблоны программирования на реальных примерах. Итак, начнем с определения задачи и требований. То, чего мы действительно хотим достичь, отражено в следующем списке:

  • микросервис в виде веб-приложения, которое будет предоставлять точку API для обеспечения поиска отелей
  • структура и принципы поиска были бы близки к тому случаю, который мы уже описывали в той статье «ElasticSearch как построить поисковую систему» (если вы ее еще не читали, то настоятельно советую это сделать, дабы сохранить логическую последовательность)
  • основная логика приложения будет реализована с использованием следующего технологического стека: Symfony PHP framework и ElasticSearch. Мы также будем использовать пакет ONGR Symfony для интеграции ElasticSearch с фреймворком Symfony.
  • приложение будет построено с использованием лучших практик программирования и известных шаблонов программирования: REST API + шаблоны проектирования swagger, DTO, Builder и Filter.
  • docker + docker compose для создания локальной среды микросервиса
  • структура микросервиса должна быть очень гибкой для дальнейшего расширения и модификации
  • наша конечная цель — получить готовый рабочий скелет, который можно легко расширить для любых дальнейших требований

Мы начнем с создания соответствующей микросервисной среды. Используя docker и docker compose, мы создадим веб-сервер, микросервисное приложение отдельно и ElasticSearch в виде отдельных докер контейнеров.

ElasticSearch tutorial environment
ElasticSearch tutorial environment

Затем мы продолжим создавать наш код, используя архитектурную схему, представленную ниже. Наш запрос на поиск будет обрабатываться контроллером, где мы сначала создадим объект DTO. Это создаст абстрактный слой между внешним миром и нашей внутренней логикой. Вы можете посмотреть на это и с другой стороны, например, у нашего поискового сервиса будет свой интерфейс для работы. Такой подход позволит нам быть гибкими в изменении параметров URL. С другой стороны, используя паттерн builder, мы могли бы легко изменить источник и тип запроса сами по себе. Например, мы можем дополнительно выставить наш поиск для какого-то внешнего микросервиса, который будет интегрирован с нашей системой через брокере сообщений очереди. Затем мы передадим наш объект критериев поиска DTO службе поиска, которая будет отвечать за представление результатов поиска и вызов объекта построителя запросов. Построитель запросов (Query Builder) будет использовать шаблон проектирования фильтра для создания нашего окончательного запроса ElasticSearch с использованием объектно-ориентированного подхода. Он также будет отвечать за добавление параметров сортировки, странницивания и агрегации. Кроме того, наш микросервис будет поддерживать уровень данных модели, который будет проецировать структуру документа ElasticSearch на соответствующие классы.

Search microservice architecture
Search microservice architecture

Ниже представлен шаблон проектирования компоновщика, который мы будем использовать для создания объекта критериев поиска DTO. Шаблон построителя (Builder Pattern) — это шаблон проектирования, предназначенный для обеспечения гибкого решения различных проблем создания объектов в объектно-ориентированном программировании. Целью шаблона проектирования Builder является отделение построения сложного объекта от его представления. В нашем упрощенном примере объект критериев поиска не будет очень сложным, но на практике мы легко можем иметь даже 50 параметров поиска. И такой подход был бы очень полезен.

Builder design pattern
Builder design pattern

Также познакомимся с паттернами проектирования фильтров (Filter pattern). Это поможет организовать наш код для создания сложных запросов ES.

Filter design pattern
Filter design pattern

В следующих статьях я попытаюсь воссоздать всю вышеупомянутую архитектуру, используя фреймворк Symfony, библиотеку ONGR, язык программирования PHP и движок ElasticSearch. Если вы не можете долго ждать, то предлагаю вам просмотреть весь этот материал на моем онлайн-курсе в udemy. Ниже ссылка на курс. Как читатель этого блога, вы также получаете возможность использовать купон, который позволит купить курс по максимально низкой цене. В противном случае, пожалуйста, подождите на следующие статьи. Спасибо за внимание.


About the author

sergii-demianchuk

Software engineer with over 18 year’s experience. Everyday stack: PHP, Python, Java, Javascript, Symfony, Flask, Spring, Vue, Docker, AWS Cloud, Machine Learning, Ansible, Terraform, Jenkins, MariaDB, MySQL, Mongo, Redis, ElasticSeach

архитектура гео докер кластер поиск поисковые системы рекомендательные системы фреймворк-flask фреймворк-spring-boot фреймворк-symfony язык-java язык-php язык-python языки программирования