为什么将数组添加到具有轻松脚本的数组中?

时间:2018-11-04 13:25:42

标签: elasticsearch logstash elasticsearch-painless

使用Logstash,如果没有为该文档的时间戳创建索引,我的目标是为该文档建立索引;否则,如果该文档确实存在且该时间戳不在数组中,则追加时间戳数组。我的问题是将数组追加到数组。

即我的输入日志行始终与要附加到Elastic中同一文档的时间戳相同。

这是我的输入数据。

  • 请注意,时间戳记是一个字符串。
  • “哈希”字段将成为文档ID(仅用于示例)

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

这是我的Logstash配置:

  • timestamp字段被分割成一个数组。
  • 第一次看到该文档时,将对其进行索引。下次吧 可以看到,脚本开始运行。
  • 该脚本将查看时间戳值是否存在,如果不存在, 追加。
  • 使用
  • 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。

1 个答案:

答案 0 :(得分:1)

问题在于split => { "timestamp" => "," }timestamp字段转换为数组,而add方法接受一个对象,并将其追加到原始数组(它不连接两个数组)。

不费吹灰之力地尝试访问timestamp数组的第一个元素,如下所示: if(ctx._source.timestamp.contains(params.event.get("timestamp")[0])) return true; else (ctx._source.timestamp.add(params.event.get("timestamp")[0]))