通过logstash更新Elasticsearch现有文档并插入当前记录
Update existing document of Elasticsearch and insert current record through logstash
我正在尝试将记录插入 elasticsearch 并更新现有文档的字段,我将从当前记录中获取其 _id。网上查了下,发现我们可以用logstash中的http插件_update_by_query api。这是下面的配置。
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "my_index_*"
document_id => "%{id_field}"
}
http {
url => "http://localhost:9200/my_index_*/_update_by_query"
http_method => "post"
content_type => "application/json"
format => "message"
message => '{"query":{"match":{"_id":"%{previous_record_id}"}},"script":{"source":"ctx._source.field_to_be_updated=xyz","lang":"painless"}}'
}
}
Elasticsearch 没有密码保护,所以我没有添加授权header。
但是当我启动 logstash 时,插入了当前记录,但我总是出现以下 http 插件错误。
2022-05-05T11:31:51,916][ERROR][logstash.outputs.http ][logstash_txe] [HTTP Output Failure] Encountered non-2xx HTTP code 400 {:response_code=>400, :url=>"http://localhost:9200/my_index_*/_update_by_query", :event=>#<LogStash::Event:0x192606f8>}
这不是你应该做的,你可以简单地使用 elasticsearch
两种用例的输出。
第一个用于索引新记录,下一个用于部分更新另一条 ID 为 previous_record_id
的记录。可以在脚本中的 params.event
中访问事件数据:
elasticsearch {
hosts => ["localhost:9200"]
index => "my_index_xyz"
document_id => "%{previous_record_id}"
action => "update"
script => "ctx._source.field_to_be_updated = params.event.xyz"
script_lang => "painless"
script_type => "inline"
}
我正在尝试将记录插入 elasticsearch 并更新现有文档的字段,我将从当前记录中获取其 _id。网上查了下,发现我们可以用logstash中的http插件_update_by_query api。这是下面的配置。
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "my_index_*"
document_id => "%{id_field}"
}
http {
url => "http://localhost:9200/my_index_*/_update_by_query"
http_method => "post"
content_type => "application/json"
format => "message"
message => '{"query":{"match":{"_id":"%{previous_record_id}"}},"script":{"source":"ctx._source.field_to_be_updated=xyz","lang":"painless"}}'
}
}
Elasticsearch 没有密码保护,所以我没有添加授权header。 但是当我启动 logstash 时,插入了当前记录,但我总是出现以下 http 插件错误。
2022-05-05T11:31:51,916][ERROR][logstash.outputs.http ][logstash_txe] [HTTP Output Failure] Encountered non-2xx HTTP code 400 {:response_code=>400, :url=>"http://localhost:9200/my_index_*/_update_by_query", :event=>#<LogStash::Event:0x192606f8>}
这不是你应该做的,你可以简单地使用 elasticsearch
两种用例的输出。
第一个用于索引新记录,下一个用于部分更新另一条 ID 为 previous_record_id
的记录。可以在脚本中的 params.event
中访问事件数据:
elasticsearch {
hosts => ["localhost:9200"]
index => "my_index_xyz"
document_id => "%{previous_record_id}"
action => "update"
script => "ctx._source.field_to_be_updated = params.event.xyz"
script_lang => "painless"
script_type => "inline"
}