You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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输出的时间格式调整
        }
      }
    }
  }
}

关键注意事项

  1. 字段名要完全匹配:模板里的*port*、*len*这些匹配规则,要和tshark实际输出的字段名一致(比如tshark输出的是tcp.port还是tcpport,别写错)。
  2. 模板只对新索引生效:如果已经创建了旧的索引,模板不会自动修改已有索引的映射。这种情况要么重新创建索引,要么手动更新已有索引的映射(但注意:ES不允许修改已有字段的类型,只能新增字段)。
  3. 验证映射是否生效:写入一些测试数据后,用GET tshark-2024.05.20/_mapping(替换成你的索引名)查看字段类型,确认端口、长度等字段已经是integer/long类型。

内容的提问来源于stack exchange,提问作者Bat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:40:49