elasticsearch - Logstash doc_as_upsert在Elasticsearch中交叉索引消除重复

标签 elasticsearch logstash elastic-stack

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

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 来防止这种情况发生到您的管道,它将在所有索引中查找文档,如果找到一个,它可能会删除该事件。

像这样的事情会做(注意 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 {}
    }
}

关于elasticsearch - Logstash doc_as_upsert在Elasticsearch中交叉索引消除重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41070865/

相关文章:

csv - 追加json logstash elasticsearch数组

elasticsearch - 只返回匹配字段而不是返回整个文档

elasticsearch - Kibana 将@timestamp 字段显示为可读格式

elasticsearch - 如何在logstash中基于grok创建过滤器

elasticsearch - 要在Logstash中解析的多个模式

elasticsearch - ElasticSearch:解释所有文档 “_size”和 “store.size_in_bytes” API端点之和之间的差异吗?

elasticsearch - 可选字段Grok模式LOGSTASH

docker - 如何将 Docker 中的 elasticsearch 的 "xpack.security.enrollment.enabled"设置为“true”

java - Elasticsearch - 升级到 2.1.1 后搜索失败

elasticsearch - Stormcrawler -> Elasticsearch 的最佳设置,如果爬行的礼貌不是问题?