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

2024-03-17

我有一个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在同一索引中看到相同的文档时,这是有效的,但由于生成输入数据的命令没有可靠的不同文档出现的速率,logstash有时会在不同的带日期标记的索引中插入重复的文档。

例如,logstash 运行获取输入的命令通常会返回最近两个小时的数据。但是,由于我无法明确判断文档何时出现/消失,因此我每十五分钟调整一次命令。

当重复发生在同一小时内时,这很好。但是,当小时或日期时间戳翻转并且文档仍然出现时,elastic/logstash 认为它是一个新文档。

有没有办法让 upsert 工作交叉索引?这些都是相同类型的文档,它们将简单地应用于与“usage-*”匹配的每个索引


新索引是一个全新的键空间,没有办法告诉 ES 不要在两个不同的索引中为具有相同 ID 的两个文档建立索引。

但是,您可以通过添加一个来防止这种情况发生elasticsearch filter https://www.elastic.co/guide/en/logstash/current/plugins-filters-elasticsearch.html到您的管道,它将在所有索引中查找文档,如果找到一个,它可能会删除该事件。

像这样的事情会做(注意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 {}
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Logstash doc_as_upsert Elasticsearch 中的交叉索引以消除重复 的相关文章

随机推荐