Elasticsearch,当索引不存在时用脚本更新文档
Elasticsearch, upsert a document with script when the index does not exist
我在 logstash 中接收了一些有效载荷,我将它们推送到 Elastic 的每月滚动索引中,并使用脚本允许我根据这些有效载荷的状态顺序覆盖字段。
示例:
{
"id" : "abc",
"status" : "OPEN",
"field1" : "foo",
"opening_ts" : 1234567
}
{
"id" : "abc",
"status" : "CLOSED",
"field1" : "bar",
"closing_ts": 7654321
}
我想要这样,即使我在关闭后收到 ID“abc”的负载打开,我的弹性文档也是:
{
"_id" : "abc",
"status": "CLOSED",
"field1" : "bar",
"closing_ts": 7654321,
"opening_ts" : 1234567
}
我为了保证,我在 logstash 的弹性输出插件中添加了一个脚本
script => "
if (ctx._source['status'] == 'CLOSED') {
for (key in params.event.keySet()) {
if (ctx._source[key] == null) {
ctx._source[key] = params.event[key]
}
}
} else {
for (key in params.event.keySet()) {
ctx._source[key] = params.event[key]
}
}
"
Buuuuut,添加此脚本还在索引上的隐式“PUT”之间添加了一个额外的步骤,如果目标索引不存在,脚本将失败并且永远不会创建整个文档。 (也不是索引)
你知道我如何处理这个脚本中的错误吗?
你需要求助于scripted upsert:
output {
elasticsearch {
index => "your-index"
document_id => "%{id}"
action => "update"
scripted_upsert => true
script => "... your script..."
}
}
我在 logstash 中接收了一些有效载荷,我将它们推送到 Elastic 的每月滚动索引中,并使用脚本允许我根据这些有效载荷的状态顺序覆盖字段。
示例:
{
"id" : "abc",
"status" : "OPEN",
"field1" : "foo",
"opening_ts" : 1234567
}
{
"id" : "abc",
"status" : "CLOSED",
"field1" : "bar",
"closing_ts": 7654321
}
我想要这样,即使我在关闭后收到 ID“abc”的负载打开,我的弹性文档也是:
{
"_id" : "abc",
"status": "CLOSED",
"field1" : "bar",
"closing_ts": 7654321,
"opening_ts" : 1234567
}
我为了保证,我在 logstash 的弹性输出插件中添加了一个脚本
script => "
if (ctx._source['status'] == 'CLOSED') {
for (key in params.event.keySet()) {
if (ctx._source[key] == null) {
ctx._source[key] = params.event[key]
}
}
} else {
for (key in params.event.keySet()) {
ctx._source[key] = params.event[key]
}
}
"
Buuuuut,添加此脚本还在索引上的隐式“PUT”之间添加了一个额外的步骤,如果目标索引不存在,脚本将失败并且永远不会创建整个文档。 (也不是索引)
你知道我如何处理这个脚本中的错误吗?
你需要求助于scripted upsert:
output {
elasticsearch {
index => "your-index"
document_id => "%{id}"
action => "update"
scripted_upsert => true
script => "... your script..."
}
}