gpt4 book ai didi

elasticsearch - 为什么要使用无痛脚本将数组添加到数组?

转载 作者:行者123 更新时间:2023-11-29 02:53:02 24 4
gpt4 key购买 nike

使用 Logstash,我的目标是在该文档的时间戳之前未被索引时对该文档进行索引,否则,如果该文档确实存在并且时间戳不在数组中,则附加时间戳数组。我的问题是数组附加到数组。

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

这是我的输入数据。

  • 注意时间戳是一个字符串。
  • “哈希”字段将成为文档 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 方法获取一个对象并将其附加到原始数组(它不会连接两个数组)。

轻松尝试访问 timestamp 数组的第一个元素,就像这样:if(ctx._source.timestamp.contains(params.event.get("timestamp")[0])) 返回真; else (ctx._source.timestamp.add(params.event.get("timestamp")[0]))

关于elasticsearch - 为什么要使用无痛脚本将数组添加到数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53141308/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com