elasticsearch – 为什么数组添加到无痛脚本的数组?

使用Logstash,我的目标是在文档的时间戳之前没有被索引的情况下索引文档,否则,如果文档确实存在且时间戳不在数组中,则附加时间戳数组.我的问题是数组附加到数组.

即我的输入日志行总是与我想要附加到Elastic中的同一文档的时间戳相同的EXCEPT.

这是我的输入数据.

>请注意,timestamp是一个字符串.
>“哈希”字段将成为文档ID(仅作为示例)

{"timestamp":"1534023333", "hash":"1"}
{"timestamp":"1534022222", "hash":"1"}
{"timestamp":"1534011111", "hash":"1"}

这是我的Logstash配置:

>时间戳字段被拆分,将其转换为数组.
>第一次看到文档时,它被编入索引.下次呢
看到,脚本运行.
>脚本查看时间戳值是否存在,如果不存在,
附加.
>使用了params.event.get,因为它阻止了动态脚本编译

input {
  file {
    path => "timestamp.json"
    start_position => "beginning"
    codec => "json"
  }
}

filter {
    mutate {
        split => { "timestamp" => "," }
    }
}

output {
  elasticsearch {
    hosts => ["http://127.0.0.1:9200"]
    index => "test1"
    document_id => "%{[hash]}"
    doc_as_upsert => true
    script =>     'if(ctx._source.timestamp.contains(params.event.get("timestamp"))) return true; else (ctx._source.timestamp.add(params.event.get("timestamp")))'
    action => "update"
    retry_on_conflict=>3

  }
  #stdout { codec => rubydebug }
}

这是输出.

>请注意,时间戳是一个数组.但是每个值都被赋予了
数组作为数组.

 "timestamp": [
      "1534011111",
      [
        "1534022222"
      ],
      [
        "1534023333"
      ]
    ],

我想要的是输出:

 "timestamp": [
      "1534011111",
      "1534022222"
      "1534023333"
    ],

如何获得所需的输出?我正在运行Elasticsearch 6.4.2和Logstash 6.4.2.

最佳答案 问题是split => {“timestamp”=> “,”}将timestamp字段转换为数组,add方法接受一个对象并将其附加到原始数组(它不会连接两个数组).

在painless中尝试访问timestamp数组的第一个元素,如下所示:
if(ctx._source.timestamp.contains(params.event.get(“timestamp”)[0]))返回true; else(ctx._source.timestamp.add(params.event.get(“timestamp”)[0]))

点赞