通过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"
}