我有一个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 - *”
的每个索引答案 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 {}
}
}