Используя Logstash, моя цель состоит в том, чтобы проиндексировать документ, если временная метка для этого документа еще не была проиндексирована, в противном случае, если документ существует, а временная метка отсутствует в массиве, затем добавьте массив временной метки. Моя проблема в том, что массив добавляется в массив.
т.е. моя строка входного журнала всегда одинакова, КРОМЕ для отметки времени, которую я хочу добавить к тому же документу в Elastic.
Вот мои входные данные.
- Обратите внимание, что отметка времени является строкой.
Поле «хэш» станет идентификатором документа (только для примера)
{"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.