使用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
字段?
谢谢!
答案 0 :(得分:0)
你不能将@metadata
字段与输出插件一起使用,它们不会被发送(这是元数据的目的)。
因此,您可以添加mutate过滤器或ruby过滤器以将元数据字段复制到事件数据:
ruby {
code => 'event.get("[@metadata][rabbitmq_headers]").each {|k,v| event.set(k, v)}'
}