7

我有一些logstash输入,我使用document_id删除重复项。但是,大多数输入没有document_id. 以下是实际的document_id通过,但如果它不存在,它会被接受为字面意思%{document_id},这意味着大多数文档被视为彼此的副本。这是我的输出块的样子:

output {
        elasticsearch_http {
            host => "127.0.0.1"
            document_id => "%{document_id}"
        }
}

我想我也许可以在输出中使用条件。它失败了,错误在代码下方给出。

output {
        elasticsearch_http {
            host => "127.0.0.1"
            if document_id {
                document_id => "%{document_id}"
            } 
        }
}

Error: Expected one of #, => at line 101, column 8 (byte 3103) after output {
        elasticsearch_http {
    host => "127.0.0.1"
    if 

我尝试了一些“if”语句,但它们都失败了,这就是为什么我认为问题在于该块中有任何类型的条件。以下是我尝试过的替代方案:

if document_id <> "" {
if [document_id] <> "" {
if [document_id] {
if "hello" <> "" {
4

3 回答 3

9

您已接近条件想法,但不能将其放在插件块中。改为这样做:

output {
  if [document_id] {
    elasticsearch_http {
      host => "127.0.0.1"
      document_id => "%{document_id}"
    } 
  } else {
    elasticsearch_http {
      host => "127.0.0.1"
    } 
  }
}

(但其他答案之一中使用 uuid 过滤器的建议也很好。)

于 2015-05-14T15:06:02.203 回答
5

解决此问题的一种方法是确保 adocument_id始终可用。您可以通过在过滤器部分添加一个UUID 过滤器document_id来实现此目的,如果该字段不存在,它将创建该字段。

filter {
    if "" in [document_id] {
        uuid {
            target => "document_id"
        }
    }
}

根据 Magnus Bäck 的建议进行编辑。谢谢!

于 2015-05-14T04:09:02.497 回答
0

参考:docinfo_fields

对于在 elasticsearch 中添加的任何文档,如果在插入期间未指定 _id,则会自动生成。docinfo_fields稍后我们可以使用相同的 _id 通过使用功能更新/删除/搜索查询。

例子 :

filter {
    json {
        source => "message"
    }
    
    elasticsearch {
        hosts => "http://localhost:9200/"
        user => elastic
        password => elastic
        query => "..."
        docinfo_fields => {
          "_id" => "docid"
          "_index" => "document_index"
        }
    }
    if ("_elasticsearch_lookup_failure" not in [tags]) {
        #... doc update logic ...
    }
}
output {
    elasticsearch {
        hosts => "http://localhost:9200/"
        user => elastic
        password => elastic
        index => "%{document_index}"
        action => "update"
        doc_as_upsert => true
        document_id => "%{docid}"
    }
}
于 2021-05-16T05:52:00.817 回答