Использование ElasticSearch Bulk для динамического обновления и создания документов?

В настоящее время я использую elasticsearch и запускаю задание cron каждые 10 минут, которое находит вновь созданные/обновляемые данные из моей БД и синхронизирует их с elasticsearch. Однако я хочу использовать bulk для синхронизации вместо создания произвольного количества запросов на обновление/создание документов в индексе. Я использую библиотеку elasticsearch.js, созданную elasticsearch.

Я сталкиваюсь с двумя проблемами, с которыми я не уверен, как справиться:

  • Как использовать bulk для обновления документа, если он существует, и создать документ, если он не входит в bulk, не зная, существует ли он в индексе.
  • Как отформатировать большое количество JSON для запуска через bulk для обновления/создания документа, потому что bulk API ожидает, что тело будет отформатировано определенным образом.

person guyforlowbro    schedule 06.06.2016    source источник
comment
Это зависит от того, как вы идентифицируете документ для обновления/вставки... Кроме того, для массовых обновлений или вставок, если он не существует, есть опция upsert: elastic.co/guide/en/elasticsearch/reference/current/. Все зависит от того, как вы связываете запись БД с документами ES...   -  person Andrei Stefan    schedule 06.06.2016


Ответы (1)


Лучший вариант при попытке передать данные из базы данных SQL — использовать JDBC Input от Logstash. сделать это за вас (документация< /а>). Это может, мы надеемся, просто сделать все это для вас.

Не все схемы SQL упрощают это, поэтому для ваших конкретных вопросов:

Как использовать пакет для обновления документа, если он существует, и создать документ, если его нет в пакете, не зная, существует ли он в индексе.

В настоящее время Bulk принимает четыре различных типа запросы, которые ведут себя не так, как вы, вероятно, ожидаете от мира SQL:

  • index
  • create
  • update
  • delete

Первый, index, является наиболее часто используемым вариантом. Это означает, что вы хотите index (глагол) что-то добавить в индекс Elasticsearch (существительное). Однако, если он уже существует в индексе с таким же _id, он заменит его. Остальные, наверное, более очевидны.

Каждый из подзапросов ведет себя как отдельная опция, с которой они связаны (таким образом, update — это UpdateRequest под капотом, delete — это DeleteRequest, а index — это IndexRequest). В случае create это специализация index, которая фактически говорит: «добавьте это, если оно не существует, но не используйте его, если оно существует».

Как отформатировать большое количество JSON, чтобы выполнить массовое обновление/создание документа, потому что массовый API ожидает, что тело будет отформатировано определенным образом.

Вам следует рассмотреть возможность использования подхода Logstash или любой из существующих клиентских языковых библиотек, таких как Клиент Python, который должен хорошо работать из cron. Клиенты позаботятся о форматировании за вас. Один для вашего предпочитаемого языка, скорее всего, уже существует.

person pickypg    schedule 06.06.2016
comment
при использовании создания в пакете вы должны указать идентификатор? Или он может иметь данные произвольной формы? Без идентификатора он не может распознать, существует документ или нет? - person guyforlowbro; 06.06.2016
comment
Нет, но, честно говоря, глупо не указывать идентификатор с помощью create, потому что преимущество create заключается в том, что вы получаете уведомление о том, что ничего не было заменено быстрым способом (и, в зависимости от версии ES, вы избегаете выполнения работы это действительно операция noop). Без идентификатора он сгенерирует для вас UUID, и поэтому у него никогда не будет коллизии. - person pickypg; 06.06.2016