如何访问Elasticsearch输出脚本字段中的@metadata

时间:2018-05-22 16:12:40

标签: elasticsearch logstash

使用elasticsearch输出模块,我将doc_as_upsert设置为true以进行许多更新操作。我正在使用@metadata功能来存储我不想将其插入ES的字段。

但是,我在访问Elasticsearch脚本函数中的@metadata内部时遇到问题。以下脚本确保urls数组小于1,001,并确保添加的新URL对于数组是唯一的:

output {
   elasticsearch{
      hosts => "***************"
      user => "****"
      index => "****"
      password => "*********"
      document_type => "document"
      document_id => "%{[@metadata][domain]}"
      action => "update"
      script => 'if(ctx._source.urls.length < 1001){ boolean match = false; for (url in ctx._source.urls){if (url == params.event.get("[@metadata][url]")){match = true;}} if(match==false){ctx._source.urls.add(params.event.get("[@metadata][url]"));}}'
      doc_as_upsert => true
   }
}

在ES内部,URL值仅作为NULL附加。我查看了rubydebug中的url元数据字段,肯定会被添加。我无法直接引用元数据%{[@metadata][domain]},因为我为太多生成的脚本遇到了脚本编译错误。

有没有办法访问elasticsearch输出插件脚本函数中的metadata.url字段?

谢谢!

1 个答案:

答案 0 :(得分:0)

你不能将@metadata字段与输出插件一起使用,它们不会被发送(这是元数据的目的)。

因此,您可以添加mutate过滤器或ruby过滤器以将元数据字段复制到事件数据:

ruby {
    code => 'event.get("[@metadata][rabbitmq_headers]").each {|k,v| event.set(k, v)}'
}