Logstash 到 Elasticsearch 在字段中添加新数据而不是覆盖现有数据?

Logstash to Elasticsearch adding new data in the fields instead of overwriting the existing data?

我的管道是这样的:CouchDB -> Logstash -> ElasticSearch。每次更新 CouchDB 中的字段值时,Elasticsearch 中的数据都会被覆盖。我的要求是,当 CouchDB 中的字段中的数据更新时,我想在 Elasticsearch 中创建一个新数据而不是覆盖现有数据。

我现在的logstash.conf是这样的:

input {
    couchdb_changes {
        host => "<ip>"
        port => <port>
        db => "test_database"
        keep_id => false
        keep_revision => true
        initial_sequence => 0
        always_reconnect => true
        #sequence_path => "/usr/share/logstash/config/seqfile"
    }
}

output {
    if([doc][doc_type] == "HR") {
        elasticsearch {
            hosts => ["http://elasticsearch:9200"]
            index => "hrindex_new_1"
            document_id => "%{[doc][_id]}"
            user => elastic
            password => changeme
        }
    }
    if([doc][doc_type] == "SoftwareEngg") {
        elasticsearch {
            hosts => ["http://elasticsearch:9200"]
            index => "softwareenggindex_new"
            document_id => "%{[doc][_id]}"
            user => elastic
            password => changeme
        }
    }
}

如何操作?

您在 elasticsearch 输出中使用了 document_id 选项,这个选项的作用是告诉 elasticsearch 它应该使用这个值作为文档 id 来索引文档,这将是一个唯一的 id。

document_id => "%{[doc][_id]}"

因此,如果在您的源文档中字段 [doc][_id] 具有例如 1000 的值,则 elasticsearch 中的 _id 字段也将具有相同的值。

当您更改源文档中 [doc][_id] 等于 1000 的内容时,它会替换 elasticsearch 中 _id 等于 1000 的文档因为 _id 是唯一的。

为了达到您的要求,您需要从输出中删除选项 document_id,这样 elasticsearch 将为文档的 _id 字段生成一个唯一值。

elasticsearch {
    hosts => ["http://elasticsearch:9200"]
    index => "softwareenggindex_new"
    user => elastic
    password => changeme
}