使用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]))