Elasticsearch,当索引不存在时用脚本更新文档

Elasticsearch, upsert a document with script when the index does not exist

我在 logstash 中接收了一些有效载荷,我将它们推送到 Elastic 的每月滚动索引中,并使用脚本允许我根据这些有效载荷的状态顺序覆盖字段。

示例:

{
 "id" : "abc",
 "status" : "OPEN",
 "field1" : "foo",
 "opening_ts" : 1234567
}
{
 "id" : "abc",
 "status" : "CLOSED",
 "field1" : "bar",
 "closing_ts": 7654321
}

我想要这样,即使我在关闭后收到 ID“abc”的负载打开,我的弹性文档也是:

{
 "_id" : "abc",
 "status": "CLOSED",
 "field1" : "bar",
 "closing_ts": 7654321,
 "opening_ts" : 1234567
}

我为了保证,我在 logstash 的弹性输出插件中添加了一个脚本

script => "
      if (ctx._source['status'] == 'CLOSED') {
        for (key in params.event.keySet()) {
          if (ctx._source[key] == null) {
            ctx._source[key] = params.event[key]
          }
        }
      } else {
        for (key in params.event.keySet()) {
          ctx._source[key] = params.event[key]
        }
      }
      "

Buuuuut,添加此脚本还在索引上的隐式“PUT”之间添加了一个额外的步骤,如果目标索引不存在,脚本将失败并且永远不会创建整个文档。 (也不是索引)

你知道我如何处理这个脚本中的错误吗?

你需要求助于scripted upsert:

output {
  elasticsearch {
    index => "your-index"
    document_id => "%{id}"
    action => "update"
    scripted_upsert => true
    script => "... your script..."
  }
}