Logstash doc_as_upsert Elasticsearch中的交叉索引以消除重复项

时间:2016-12-10 00:25:08

标签: elasticsearch logstash elastic-stack

我有一个logstash配置,它在输出块中使用以下内容以尝试减轻重复项。

output {
        if [type] == "usage" {
                elasticsearch {
                        hosts => ["elastic4:9204"]
                        index => "usage-%{+YYYY-MM-dd-HH}"
                        document_id => "%{[@metadata][fingerprint]}"
                        action => "update"
                        doc_as_upsert => true
                }

        }
}

指纹是根据两个唯一字段的SHA1哈希计算的。

当logstash在同一索引中看到相同的doc时,这是有效的,但由于生成输入数据的命令不具有显示不同文档的可靠速率,因此logstash有时会在不同的日期戳记索引中插入重复文档

例如,logstash运行以获取输入的命令通常会返回最后两小时的数据。但是,由于我无法明确告诉文档何时出现/消失,我每15分钟就会调整一次命令。

当重复项在同一小时内发生时,这很好。但是,当小时或日期日期戳滚动,文档仍然显示时,elastic / logstash认为它是一个新文档。

有没有办法让upsert工作交叉索引?这些都是相同类型的doc,它们只适用于匹配“usage - *”

的每个索引

1 个答案:

答案 0 :(得分:1)

新索引是一个全新的密钥空间,并且没有办法告诉ES不要在两个不同的索引中索引具有相同ID的两个文档。

但是,您可以通过在管道中添加elasticsearch filter来阻止此操作,该管道将在所有索引中查找文档,如果找到,则可能会丢弃该事件。

这样的事情会发生(注意usages将是跨越所有usage-*索引的别名):

filter {
    elasticsearch {
        hosts => ["elastic4:9204"]
        index => "usages"
        query => "_id:%{[@metadata][fingerprint]}"
        fields => {"_id" => "other_id"}
    }
    # if the document was found, drop this one
    if [other_id] {
        drop {}
    }
}