为什么要使用无痛脚本将数组添加到数组?
Why is an array adding to an array with painless script?
使用 Logstash,我的目标是在该文档的时间戳之前未被索引时对该文档进行索引,否则,如果该文档确实存在并且时间戳不在数组中,则附加时间戳数组。我的问题是数组附加到数组。
即我的输入日志行始终相同,除了我想附加到 Elastic 中同一文档的时间戳。
这是我的输入数据。
- 注意时间戳是一个字符串。
"hash"字段将成为文档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])) return true; else (ctx._source.timestamp.add(params.event.get("timestamp")[0]))
使用 Logstash,我的目标是在该文档的时间戳之前未被索引时对该文档进行索引,否则,如果该文档确实存在并且时间戳不在数组中,则附加时间戳数组。我的问题是数组附加到数组。
即我的输入日志行始终相同,除了我想附加到 Elastic 中同一文档的时间戳。
这是我的输入数据。
- 注意时间戳是一个字符串。
"hash"字段将成为文档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])) return true; else (ctx._source.timestamp.add(params.event.get("timestamp")[0]))