Автоматизировать индексирование данных в эластичный поиск
У меня есть модель, поток которой выглядит следующим образом
CMS -> Postgres -> Elasticsearch -> Запросы из Elasticsearch -> Окончательный результат
Каждый день новые поля добавляются в CMS, а затем данные передаются в Elasticsearch. Однако это занимает много времени, учитывая огромное количество данных.
Может ли быть способ, чтобы каждый раз, когда новая запись добавлялась в CMS, она одновременно передавалась в Elasticsearch, не запрашивая вручную приложение для этого?
Я хочу автоматизировать процесс отправки данных в Elasticsearch из CMS. Любой вклад будет приветствоваться.
Кроме того, я использую эластичный поиск в качестве основы.
2 ответа
Если говорить о последнем замечании Джейсона, если вам действительно нужны обновления в реальном времени с Postgres на Elasticsearch, вам понадобится использовать триггеры и некоторую систему передачи данных из БД в ES.
Один метод, с которым я экспериментировал, требует написания выделенного шлюза Postgres->ES и использования некоторых специфических для Postgres функций. Я написал об этом здесь: http://haltcondition.net/2014/04/realtime-postgres-elasticsearch/
Принцип на самом деле довольно прост, сложность метода, который я придумал, связана с обработкой угловых случаев, таких как несколько запущенных шлюзов и шлюзы на некоторое время становятся недоступными. Короче мое решение:
- Присоедините триггер ко всем интересующим таблицам, который копирует обновленные идентификаторы строк во временную таблицу.
- Триггер также генерирует асинхронное уведомление об обновлении строки.
- Отдельный шлюз (мой написан на Clojure) подключается к серверу Postgres и прослушивает уведомления. Это сложная часть, так как не все клиентские драйверы Postgres поддерживают асинхронные уведомления (есть новый экспериментальный драйвер JDBC, который делает, что я и использую, похоже, что psycopg также поддерживает это).
- При обновлении шлюз считывает, преобразует и передает данные в Elasticsearch.
В моих экспериментах эта модель способна обновлять Elasticsearch за доли секунды после вставки / обновления строки Postgres. Очевидно, что это будет меняться в реальном мире, хотя.
Здесь есть проект для проверки концепции с тестовыми средами Vagrant и Docker: https://bitbucket.org/tarkasteve/postgres-elasticsearch-realtime
В вопросе не хватает многих деталей, но, учитывая, что вы переходите из Postgres в ElasticSearch, вы можете использовать "реку" JDBC для передачи или извлечения данных вместе с постепенными изменениями в ES. Реки - это плагины к ElasticSearch, которые управляют приемом данных. Реку ElasticSearch JDBC можно найти по адресу: https://github.com/jprante/elasticsearch-river-jdbc и в этом небольшом учебнике есть упоминание: http://voormedia.com/blog/2014/06/four-ways-to-index-relational-data-in-elasticsearch
Вы можете индексировать полную загрузку, а также отслеживать обновления по таймеру по метке времени или порядковому номеру. Это в основном отправляет пакеты изменений с заданным интервалом в ElasticSearch.
Если вы хотите вносить изменения по мере их появления, это то, что вы должны кодировать либо в своей CMS, либо в качестве триггеров в Postgres, если они способны отправлять HTTP-вызовы в REST API ElasticSearch (я не знаю Postgres достаточно хорошо, чтобы знать, могут ли они это сделать). Но отправка данных на самом деле не проблема ElasticSearch, это то, что вы должны решить в своей CMS или приложении, которое управляет данными.