试试搜索一下吧

logstash 利用filter 将nested嵌套格式的数据导入es,但es中mapping并没有nested类型

Logstash | 作者 Lotus | 发布于2019年06月18日 | 阅读数:300

版本须知:es6.5.4 logstash6.5.4想通过logstash 自动轮询oracel DB,对数据进行filter操作,整合成nested类型,使用的自定义模板,也设定了相应主字段为nested类型,能够成功将数据导入es,但是查看es中的mapping,发现并不是nested类型,使用nested查询也无效
已邀请:

bellengao - 博客: https://www.jianshu.com/u/e0088e3e2127

赞同来自:

是不是多个模板都被应用上了,模板的order越大,优先级越高

Lotus - 90后

赞同来自:

1560930470(1).jpg

 nested查询 报错信息如下,究其原因 还是因为 tbl 这个主字段设计是nested类型,但并不是,如下图所示:
1560930582(1).jpg

menglinjie

赞同来自:

建议先创建索引,指定索引类型是nested,再借助aggregate filter将数据转为嵌套类型。我是这样做的,可以成功。
不过要注意一个问题,配置中需要指定线程数
pipeline.workers=1 否则聚合出来的子数组对象是不准确的,会丢失一些数据。

filter {
aggregate {
task_id => "%{id}"
code => "
map['id'] = event.get('id')
map['register_name'] = event.get('register_name')
map['mobile'] = event.get('mobile')
map['avatar'] = event.get('avatar')
map['pet_list'] ||=[]
map['pets'] ||=[]
if (event.get('pet_id') != nil)
if !(map['pet_list'].include? event.get('pet_id'))
map['pet_list'] << event.get('pet_id')
map['pets'] << {
'pet_id' => event.get('pet_id'),
'name' => event.get('name'),
'images' => event.get('images'),
'breed_id' => event.get('breed_id'),
'breed_name' => event.get('breed_name'),
'birthday' => event.get('birthday')
}
end
end

event.cancel()
"

push_previous_map_as_event => true
timeout => 5
}
json {
source => "message"
remove_field => ["message"]
#remove_field => ["message", "type", "@timestamp", "@version"]
}
mutate {
#将不需要的JSON字段过滤,且不会被存入 ES 中
remove_field => ["tags", "@timestamp", "@version"]
}
}

要回复问题请先登录注册