Logstash doc_as_upsert Elasticsearch 交叉索引消除重复
Logstash doc_as_upsert cross index in Elasticsearch to eliminate duplicates
我有一个 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运行获取输入的命令一般是returns最近两个小时的数据。但是,由于我无法确定文档何时 appear/disappear,我每十五分钟调整一次命令。
当重复出现在同一小时内时,这很好。但是,当小时或天日期戳翻转时,文档仍然出现,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 {}
}
}
我有一个 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运行获取输入的命令一般是returns最近两个小时的数据。但是,由于我无法确定文档何时 appear/disappear,我每十五分钟调整一次命令。
当重复出现在同一小时内时,这很好。但是,当小时或天日期戳翻转时,文档仍然出现,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 {}
}
}