【问题标题】:Use Kafka Connect to update Elasticsearch field on existing document instead of creating new使用 Kafka Connect 更新现有文档上的 Elasticsearch 字段,而不是创建新的
【发布时间】:2020-02-13 05:51:35
【问题描述】:

我使用 Elasticsearch 连接器运行了 Kafka 设置,并且我正在根据特定主题的传入消息成功地将新文档索引到 ES 索引中。

但是,基于另一个主题的传入消息,我需要将数据附加到同一索引中特定文档的字段中。

下面的伪模式:

{
   "_id": "6993e0a6-271b-45ef-8cf5-1c0d0f683acc",
   "uuid": "6993e0a6-271b-45ef-8cf5-1c0d0f683acc",
   "title": "A title",
   "body": "A body",
   "created_at": 164584548,
   "views": []
}

^ 根据上​​述主题中的数据,此文档正在 ES 中正常创建。

但是,如何使用来自另一个主题的消息将项目添加到 views 字段。像这样:

article-view主题架构:

{
   "article_id": "6993e0a6-271b-45ef-8cf5-1c0d0f683acc",
   "user_id": 123456,
   "timestamp: 136389734
}

而不是简单地在article-view 索引上创建一个新文档(我什至不想拥有它)。它将这个附加到文章文档的views 字段中,对应的_id 等于消息中的article_id。

所以一条消息之后的最终结果是:

{
   "_id": "6993e0a6-271b-45ef-8cf5-1c0d0f683acc",
   "uuid": "6993e0a6-271b-45ef-8cf5-1c0d0f683acc",
   "title": "A title",
   "body": "A body",
   "created_at": 164584548,
   "views": [
       {
           "user_id": 123456,
           "timestamp: 136389734
       }
   ]
}

使用 ES API 可以使用脚本。像这样:

{
    "script": {
        "lang": "painless",
        "params": {
            "newItems": [{
                "timestamp": 136389734,
                "user_id": 123456
            }]
        },
        "source": "ctx._source.views.addAll(params.newItems)"
    }
}

我可以像上面那样动态批量生成脚本,然后使用ES Python库中的helpers.bulk函数来批量更新文档。

Kafka Connect / Elasticsearch 可以做到这一点吗?我在 Confluent 的网站上没有找到任何文档来解释如何执行此操作。

这似乎是一个相当标准的要求,也是人们需要使用 Kafka / ES 之类的接收器连接器来做的一件显而易见的事情。

谢谢!

【问题讨论】:

  • 所以你在 Kafka 中有一个用户页面浏览事件流,并且你想要一个 ES 中的索引,每页一个文档并嵌入每个用户/ts 访问的数组中?那么这会驱动什么流程/应用程序?
  • 该过程允许我们直接查询“页面”索引并直接获取指标,而无需“加入”或执行后续查询来获取这些指标。
  • 我有类似的用例,我所做的是用它的密钥发送更新的文档。 ES "更新" 文档,因为它与前一个具有相同的 ket...

标签: elasticsearch apache-kafka apache-kafka-connect confluent-platform


【解决方案1】:

编辑:使用 write.method=upsert (src) 可以进行部分更新


Elasticsearch 连接器不支持此功能。您可以就地更新文档,但需要发送完整的文档,而不是附加的增量,我认为这是您所追求的。

【讨论】:

  • 感谢您这么快的回复。您会建议使用 Kafka 实现这一目标的最佳方法是什么?或者这根本就不是可以做的事情......
  • @JustinMoser 如果您想根据 Kafka 中的数据实现键的状态,我实际上会查看 Kafka Streams 或 KSQL。然后,您的应用程序将改为直接查询。
  • 注意updated answer here:write.method=upsert
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多