Ответ 1
Вы в значительной степени перечислили две основные опции, которые существуют, когда речь идет о поиске по нескольким хранилищам данных, то есть поиск в одном центральном хранилище данных (опция # 1) или поиск во всех хранилищах данных и агрегирование результатов (опция # 2).
Оба варианта будут работать, хотя вариант № 2 имеет два основных недостатка:
- В вашем приложении потребуется значительное количество логики, чтобы "разветвлять" результаты поиска по нескольким хранилищам данных и объединять полученные результаты.
- Время отклика может быть разным для каждого хранилища данных, и поэтому вам придется ждать, пока самое медленное хранилище данных ответит, чтобы представить результаты поиска пользователю (если вы не обойдете это с помощью различных асинхронных технологий, таких как Ajax, веб-сокет и т.д.)
Если вы хотите обеспечить более качественный и надежный опыт поиска, вариант № 1, несомненно, получит мой голос (на самом деле, я использую этот способ в большинстве случаев). Как вы правильно заявили, основным "недостатком" этого параметра является необходимость синхронизации Elasticsearch с изменениями в других ваших хранилищах основных данных.
Поскольку ваши другие хранилища данных будут реляционными базами данных, у вас есть несколько различных вариантов синхронизации их с Elasticsearch, а именно:
- используя вход Logstash JDBC
- используя инструмент импорта JDBC
Эти первые два варианта работают отлично, но имеют один главный недостаток, то есть они не фиксируют УДАЛЕНИЯ на вашей таблице, они только фиксируют ВСТАВКИ и ОБНОВЛЕНИЯ. Это означает, что если вы когда-либо удаляете пользователя, учетную запись и т.д., Вы не сможете узнать, что вам нужно удалить соответствующий документ в Elasticsearch. Если, конечно, вы не решите удалять индекс Elasticsearch перед каждым сеансом импорта.
Чтобы облегчить это, вы можете использовать другой инструмент, который основан на binlog MySQL и, таким образом, сможет захватывать каждое событие. Там один написан на Go, один на Java и один на Python.
ОБНОВИТЬ:
Вот еще одна интересная статья в блоге на эту тему: Как синхронизировать Elasticsearch с реляционной базой данных с помощью Logstash