ELK Stack 6.2.1下创建Elasticsearch映射处理tshark捕获字段的疑问
解决tshark数据包导入ELK时的字段类型映射问题
我之前在处理tshark数据包导入ELK 6.x版本的时候也踩过一模一样的坑——tshark默认把所有输出字段都转成文本格式,直接导入ES的话,像端口号、数据包长度这些数字型字段会被当成text存储,后续根本没法做数值聚合、范围过滤这类操作。你的思路完全正确:必须通过创建索引模板来提前定义字段类型,确保ES按照我们期望的方式索引数据。
为什么要用索引模板?
ES的动态映射虽然方便,但对tshark这种结构化输出的场景并不友好——它会把带数字的字符串自动识别为text类型。而索引模板可以在索引创建前就应用我们自定义的映射规则,完美适配tshark持续写入数据包的场景(比如按日期生成的tshark-YYYY.MM.DD索引)。
具体的索引模板示例
我给你一个针对tshark常见字段的模板,你可以根据自己的实际输出字段调整:
PUT _template/tshark_packets { "index_patterns": ["tshark-*"], // 匹配你的索引命名规则,比如按日期命名的索引前缀 "order": 1, "settings": { "number_of_shards": 1, "number_of_replicas": 0 }, "mappings": { "_doc": { // ES 6.x版本默认使用_doc作为文档类型 "dynamic_templates": [ // 把端口类字段从字符串转成整数类型 { "integer_port_fields": { "match_mapping_type": "string", "match": "*port*", "unmatch": "*description*", // 排除带描述的字段,比如tcp.port.description "mapping": { "type": "integer" } } }, // 把长度类字段从字符串转成长整型 { "long_length_fields": { "match_mapping_type": "string", "match": "*len*", "mapping": { "type": "long" } } }, // 其他字符串字段同时存储text(用于全文搜索)和keyword(用于聚合) { "text_keyword_default": { "match_mapping_type": "string", "match": "*", "mapping": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } } } } ], // 手动指定特殊字段的类型(优先级高于动态模板) "properties": { "ip.src": { "type": "ip" // ES专门的IP类型,支持范围查询 }, "ip.dst": { "type": "ip" }, "frame.time": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss.SSS" // 根据tshark输出的时间格式调整 } } } } }
关键注意事项
- 字段名要完全匹配:模板里的
*port*、*len*这些匹配规则,要和tshark实际输出的字段名一致(比如tshark输出的是tcp.port还是tcpport,别写错)。 - 模板只对新索引生效:如果已经创建了旧的索引,模板不会自动修改已有索引的映射。这种情况要么重新创建索引,要么手动更新已有索引的映射(但注意:ES不允许修改已有字段的类型,只能新增字段)。
- 验证映射是否生效:写入一些测试数据后,用
GET tshark-2024.05.20/_mapping(替换成你的索引名)查看字段类型,确认端口、长度等字段已经是integer/long类型。
内容的提问来源于stack exchange,提问作者Bat
相关产品推荐
相关产品推荐

