Автоматизируйте индексацию данных в elasticsearch

У меня есть модель, поток которой выглядит следующим образом

CMS --> Postgres --> Elasticsearch --> Запрос из Elasticsearch --> Окончательный результат

Каждый день в CMS добавляются новые поля, а данные впоследствии передаются в Elasticsearch. Однако это занимает много времени, учитывая огромное количество данных.

Может ли быть способ, чтобы каждый раз, когда новая запись добавляется в CMS, она одновременно попадала в Elasticsearch, не запрашивая приложение вручную?

Я хочу автоматизировать процесс загрузки данных в Elasticsearch из CMS. Любой вклад будет приветствоваться.

Кроме того, я использую elasticsearch-py в качестве фреймворка.


person battery    schedule 02.11.2014    source источник


Ответы (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

person Steve Smith    schedule 05.11.2014

В вопросе отсутствуют многие детали, но, учитывая, что вы переходите с 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 или приложении, которое управляет данными.

person Jayson Minard    schedule 02.11.2014
comment
Обратите внимание, что реки в ElasticSearch устарели, поэтому ищите другие подходы в будущем. - person Jayson Minard; 27.12.2015