【问题标题】:Using ElasticSearch Bulk to update and create documents dynamically?使用 ElasticSearch Bulk 动态更新和创建文档?
【发布时间】:2016-06-07 03:37:04
【问题描述】:

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

我面临 2 个我不确定如何应对的挑战:

  • 如何使用bulk 更新文档(如果存在),如果文档不在bulk 中,则在不知道它是否存在于索引中的情况下创建一个文档。
  • 如何格式化大量的JSON 以运行bulk 来更新/创建文档,因为bulk api 期望body 以某种方式格式化。

【问题讨论】:

标签: elasticsearch elasticsearch-2.0


【解决方案1】:

尝试从 SQL 数据库流式传输数据时,最佳选择是使用 Logstash's JDBC Input to do it for you (the documentation)。希望这可以为您完成所有工作。

并非所有 SQL 方案都能让这变得简单,所以对于您的具体问题:

如何使用批量更新文档(如果存在)并在不知道它是否存在于索引中的情况下创建文档(如果它不在批量中)。

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

  • index
  • create
  • update
  • delete

第一个 index 是最常用的选项。这意味着您想将index(动词)某些东西添加到 Elasticsearch 索引(名词)中。但是,如果它已经存在于给定相同_id 的索引中,那么它将替换它。其余的可能更明显一些。

每个子请求的行为都类似于它们所关联的 individual 选项(因此 update 在底层是 UpdateRequestdeleteDeleteRequest ,而indexIndexRequest)。在create 的情况下,它是index 的特化,它有效地表示“如果它不存在则添加,但如果存在则失败”。

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

您应该考虑使用 Logstash 方法任何现有的客户端语言库,例如 Python client,它应该可以在 cron 中正常工作。客户会为您处理格式。您喜欢的语言很可能已经存在。

【讨论】:

  • 在批量中使用 create 时必须指定 ID 吗?或者它可以有任意形状的数据吗?没有 ID 就无法识别文档是否存在?
  • 不,但老实说,不使用 create 指定 ID 有点愚蠢,因为 create 的好处是您会收到通知,通知您没有以快速失败的方式替换任何内容(并且,根据 ES 的版本,你会避免做真正是 noop 操作的工作)。如果没有 ID,它将为您生成一个 UUID,因此永远不会发生冲突。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-19
  • 2016-01-13
  • 2016-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多