用于保持两个数据库同步的 Logstash - 无法访问 %{document_id}

Logstash to Keep Two Databases Synced - Cannot Access %{document_id}

我正在使用 Logstash 通过 API.

使我的 Elasticsearch 与 HBase 保持同步

这是我的配置文件:

input {
  elasticsearch {
    hosts => ["<elasticsearch_ip>"]
    index => "<some_name>"
    type => "<some_name>"
    query => '{ "query": {
      "bool": {
        "must_not": [
          {"term": {"synced": true}}
        ]
      }
    } }'
  }
}

filter {
  mutate {
    add_field => { "synced" => true }
  }
}

output {
  if [type] == "<some_name>" {
    http {
      format=>"json"
      http_method=>"post"
      url=>"http://<api-ip>/<endpoint>"
    }
    elasticsearch {
      hosts => [<elasticsearch-ip>]
      action => "update"
      index => "<some_name>"
      document_type => "<some_name>"
      document_id => "%{document_id}"
    }
  }
}

我想在文档中添加一个 synced 字段,这样我就不会在 HBase 中对它们进行两次索引。问题是 %{document_id} 没有转换为文档的实际 _id。我认为没有这样的字段,因为我尝试使用 add_field => { "document_id" => "%{document_id}" } 将它添加到文档正文中,但它没有被转换。我也试过 %{_id}%{id} 但没有成功。我做错了什么?

注意:我听说过守望者吗?好吧,当然,我实际上首先使用它实现了这个。但是你听说过它的价格吗?

您需要在 elasticsearch 输入中将 docinfo flag 设置为 true

  elasticsearch {
    hosts => ["<elasticsearch_ip>"]
    index => "<some_name>"
    type => "<some_name>"
    docinfo => true
    query => '{ "query": {
      "bool": {
        "must_not": [
          {"term": {"synced": true}}
        ]
      }
    } }'
  }

然后您可以使用 [@metadata][_id]

访问输出中的文档 ID
elasticsearch {
  hosts => [<elasticsearch-ip>]
  action => "update"
  index => "<some_name>"
  document_type => "<some_name>"
  document_id => "%{[@metadata][_id]}"  <-- change this
}