Elasticsearch репликация других системных данных?

Предположим, я хочу использовать эластичный поиск для реализации общего поиска на веб-сайте. Ожидается, что в верхней панели поиска будут найдены ресурсы всех видов на сайте. Документы наверняка (загруженные / проиндексированные через тика), но также такие вещи, как клиенты, аккаунты, другие люди и т. Д.

По архитектурным причинам большая часть недокументированных документов (клиенты, учетные записи) будет существовать в реляционной базе данных.

При реализации этого поиска вариант № 1 будет состоять в том, чтобы создавать версии документов всего, а затем просто использовать asticsearch для запуска всех аспектов поиска, совсем не полагаясь на реляционную базу данных для поиска объектов различных типов.

Вариант № 2 будет заключаться в том, чтобы использовать эластичный поиск только для индексации документов, что будет означать, что для общей функции "поиска по сайту" вам придется распределить несколько запросов по нескольким системам, а затем объединить результаты перед их возвратом.

Вариант № 1 выглядит намного лучше, но недостатком является то, что он требует, чтобы эластичный поиск, по сути, имел копию очень многих вещей в рабочей реляционной базе данных, а также чтобы эти копии оставались свежими при изменении ситуации.

Каков наилучший вариант для синхронизации этих магазинов, и правильно ли я считаю, что для общего поиска вариант № 1 лучше? Есть ли вариант № 3?

1 ответ

Решение

Вы в значительной степени перечислили две основные опции, которые существуют, когда дело доходит до поиска по нескольким хранилищам данных, то есть поиск в одном центральном хранилище данных (опция #1) или поиск во всех хранилищах данных и агрегирование результатов (опция #2).

Оба варианта будут работать, хотя вариант № 2 имеет два основных недостатка:

  1. В вашем приложении потребуется значительное количество логики, чтобы "разветвлять" поиски по нескольким хранилищам данных и объединять полученные результаты.
  2. Время отклика может быть разным для каждого хранилища данных, и, таким образом, вам придется ждать, пока самое медленное хранилище данных ответит, чтобы представить результаты поиска пользователю (если вы не обойдете это с помощью различных асинхронных технологий, таких как Ajax)., веб-сокет и т. д.)

Если вы хотите обеспечить более качественный и надежный опыт поиска, вариант № 1, несомненно, получит мой голос (на самом деле я так и делаю в большинстве случаев). Как вы правильно заявили, основным "недостатком" этого параметра является необходимость синхронизации Elasticsearch с изменениями в других ваших хранилищах основных данных.

Поскольку ваши другие хранилища данных будут реляционными базами данных, у вас есть несколько различных вариантов синхронизации их с Elasticsearch, а именно:

Эти первые два варианта прекрасно работают, но имеют один главный недостаток, то есть они не фиксируют УДАЛЕНИЯ на вашей таблице, они только фиксируют ВСТАВКИ и ОБНОВЛЕНИЯ. Это означает, что если вы когда-либо удалите пользователя, учетную запись и т. Д., Вы не сможете узнать, что вам нужно удалить соответствующий документ в Elasticsearch. Если, конечно, вы не решите удалять индекс Elasticsearch перед каждым сеансом импорта.

Чтобы облегчить это, вы можете использовать другой инструмент, который основан на binlog MySQL и, таким образом, сможет захватывать каждое событие. Один написан на Go, один на Java и один на Python.

Пожалуйста, взгляните на Debezium. Это платформа для сбора измененных данных (CDC), которая позволяет обрабатывать ваши данные.

Я создал простой репозиторий на github, в котором показано, как он работает с PostgreSQL и ElasticSearch.

Другие вопросы по тегам