【问题标题】:Does Logstash support Elasticsearch's _update_by_query?Logstash 是否支持 Elasticsearch 的 _update_by_query?
【发布时间】:2019-04-19 04:36:31
【问题描述】:

【问题讨论】:

    标签: elasticsearch logstash logstash-configuration


    【解决方案1】:

    使用标准的 elasticsearch 插件可以获得相同的结果:

    input {
        elasticsearch {
            hosts => "${ES_HOSTS}"
            user => "${ES_USER}"
            password => "${ES_PWD}"
            index => "<your index pattern>"
            size => 500
            scroll => "5m"
            docinfo => true
        }
    }
    
    filter {
        ...
    }
    
    output {
        elasticsearch {
            hosts => "${ES_HOSTS}"
            user => "${ES_USER}"
            password => "${ES_PWD}"
            action => "update"
            document_id => "%{[@metadata][_id]}"
            index => "%{[@metadata][_index]}"
        }
    }
    

    【讨论】:

      【解决方案2】:

      elasticsearch 输出插件只能调用_bulk 端点,即使用Bulk API

      如果你想调用Update by Query API,你需要使用http输出插件并自己在事件内部构造查询。如果您解释了您想要实现的目标,我可以用更多细节更新我的答案。

      注意:有一个issue 请求此功能,但两年后它仍然开放。

      更新

      因此,如果您的输入事件是{"cname":"wang", "cage":11},并且您想通过查询所有带有"cname":"wang" 的文档来设置"cage":11,那么您的查询需要如下所示:

      POST your-index/_update_by_query
      {
        "script": {
          "source": "ctx._source.cage = params.cage",
          "lang": "painless",
          "params": {
            "cage": 11
          }
        },
        "query": {
          "term": {
            "cname": "wang"
          }
        }
      }
      

      所以您的 Logstash 配置应该如下所示(您的输入可能会有所不同,但我使用 stdin 进行测试):

      input {
        stdin {
          codec => "json"
        }
      }
      filter {
        mutate {
          add_field => {
            "[script][lang]" => "painless"
            "[script][source]" => "ctx._source.cage = params.cage"
            "[script][params][cage]" => "%{cage}"
            "[query][term][cname]" => "%{cname}"
          }
          remove_field => ["host", "@version", "@timestamp", "cname", "cage"]
        }
      }
      output {
        http {
          url => "http://localhost:9200/index/doc/_update_by_query"
          http_method => "post"
          format => "json"
        }
      }
      

      【讨论】:

      • 嗨!我有个问题。如果我的logstash输入是"{"cname":wang, "cage":11}" 并且我想用cname=wang更新所有文档并将cage设置为11,我应该如何编写logstash conf文件来实现呢?谢谢
      • 嗨,我们在 logstash 中尝试了这个 http 响应,弹性搜索控制台抛出未找到索引的错误,并且 log stash 结果为 400:[HTTP Output Failure] Encountered non-2xx HTTP code 405 {:response_code =>405, :url=>"localhost:9200%2Ftest_index%2F_doc%2F_update_by_query", :event=>#<:event:0x54b1 org.elasticsearch.cluster.metadata.indexnameexpressionresolver>
      • @Val,你能帮我处理一下this吗?
      猜你喜欢
      • 2014-12-23
      • 1970-01-01
      • 2016-03-04
      • 2021-08-18
      • 1970-01-01
      • 2022-09-25
      • 2017-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多