Elasticsearch6如何列出所有字段?ELK2升级ELK6后的字段识别问题
解决Elasticsearch 6.x中多日志类型字段区分与字段列表查询问题
刚从ELK2升级到ELK6,肯定会遇到ES6移除索引类型(Type)带来的适配问题,我来帮你梳理下解决思路:
一、区分不同日志类型的字段
ES6开始强制一个索引只能有一个默认的doc类型,原来按日志类型拆分的多类型结构被合并,导致所有字段混在一起。要区分各日志类型的字段,核心思路是给不同源的日志打上类型标识,再结合API过滤查询:
1. 先给日志添加类型标识(关键前提)
如果是新采集的日志,在Logstash的配置中给每个日志源添加自定义字段,比如log_type:
- 处理Nginx日志的filter里加:
mutate { add_field => { "log_type" => "nginx" } } - 处理MySQL日志的filter里加:
mutate { add_field => { "log_type" => "mysql" } }
如果已经有历史数据,可以通过_reindex API给原有文档补加标识字段,比如针对原mysql类型的文档:
POST _reindex { "source": { "index": "logstash-2018.05.08_old", "type": "mysql" }, "dest": { "index": "logstash-2018.05.08" }, "script": { "source": "ctx._source.log_type = 'mysql'" } }
2. 过滤查询对应日志类型的字段
有了log_type标识后,就可以用_field_caps API精准获取某类日志的字段:
GET /logstash-2018.05.08/_field_caps?fields=* { "query": { "term": { "log_type": "mysql" } } }
这个API会返回所有出现在log_type:mysql文档中的字段,以及每个字段的类型、是否可搜索等信息,完美替代原来按类型查映射的方式。
另外,也可以通过搜索某类日志的样本文档,查看_source字段来确认该类型包含的字段:
GET /logstash-2018.05.08/_search { "query": { "term": { "log_type": "nginx" } }, "size": 1 }
二、列出索引的所有字段
ES6提供了几种便捷的方式来列出索引的所有字段:
1. 使用_mapping/field/* API
直接获取所有字段的映射详情,结构清晰:
GET /logstash-2018.05.08/_mapping/field/*
2. 使用_field_caps API(无过滤)
如果不需要区分日志类型,直接查询所有字段的元数据:
GET /logstash-2018.05.08/_field_caps?fields=*
返回结果会按字段类型(text、keyword、integer等)分组展示,非常直观。
3. 使用_stats/fields API
同时获取字段的统计信息和字段列表:
GET /logstash-2018.05.08/_stats/fields?fields=*
4. 使用_cat API(简洁文本格式)
如果喜欢更轻量化的文本输出,可以用:
GET /_cat/fielddata/logstash-2018.05.08?v
不过这个API只返回当前加载到内存中的字段数据,适合快速查看常用字段。
内容的提问来源于stack exchange,提问作者Neil Ning
相关产品推荐
相关产品推荐

