使用ElasticSearch Bulk动态更新和创建文档?

时间:2016-06-06 19:03:06

标签: elasticsearch elasticsearch-2.0

我目前正在使用elasticsearch并每隔10分钟运行一次cron作业,它会从我的数据库中找到新创建/更新的数据,并将其与elasticsearch同步。但是,我想使用bulk进行同步,而不是在索引中进行更新/创建文档的任意数量的请求。我正在使用elasticsearch创建的elasticsearch.js库。

我面临两个挑战,我不确定如何处理:

  • 如果文档存在,如何使用bulk更新文档,如果文档不在bulk内而不知道文档是否存在于索引中,则创建文档。
  • 如何格式化大量JSON以运行bulk来更新/创建文档,因为bulk api希望以某种方式格式化正文。

1 个答案:

答案 0 :(得分:1)

尝试从SQL数据库中流式传输数据时,最好的选择是使用Logstash's JDBC Input to do it for youthe documentation)。希望能为你做到这一切。

并非所有SQL方案都能让这一切变得简单,因此针对您的具体问题:

  

如果文档存在,如何使用批量更新文档,如果文档不在批量内而不知道文档是否存在于索引中,则创建文档。

Bulk currently accepts four different types of sub-requests,其行为与您可能期望来自SQL世界的行为不同:

  • index
  • create
  • update
  • delete

第一个index是最常用的选项。这意味着你想要{Elastic}索引(名词)的index(动词)。但是,如果它已经存在于给定相同_id的索引中,那么它将替换它。其余的可能更明显一点。

每个子请求的行为类似于与之关联的个人选项(因此update是一个UpdateRequestdelete }是DeleteRequestindexIndexRequest)。在create的情况下,它是index的特化,有效地说“如果它不存在则添加它,但如果确实存在则失败”。

  

如何格式化大量JSON以通过批量运行来更新/创建文档,因为批量api希望以某种方式格式化主体。

您应该考虑使用Logstash方法任何现有的客户端语言库,例如Python client,这应该可以在cron中正常运行。客户将为您处理格式。一个可能已存在的首选语言。