es模版在原有基础上增加统计字段:request_time 类型double es1/es2: c...
Creado el: 10 de diciembre de 2025
Creado el: 10 de diciembre de 2025
es模版在原有基础上增加统计字段:request_time 类型double
es1/es2: cdnclduser-default-10s-、cdnclduser-default-5m-、cdnclduser-vip1-10s-、cdnclduser-vip1-5m-
es3/es4:cdncld-common-10s-、cdncld-common-5m-
为什么要调整模版,es的字段原来是固定的吗
下面分两部分回答你的问题:
1)为什么需要调整 ES 模版来新增字段
2)ES 的字段是不是固定的
request_time: double)因为 ES(Elasticsearch)中索引的字段类型是根据模版或首次写入文档时自动推断并固定下来的。
如果系统原来没有 request_time 这个字段,现在需要新增 统计字段,那么必须在索引模版里声明,否则会出现以下问题:
举例:"123"(字符串)写进一个从未定义过的字段
→ ES 可能自动映射为 text 或 keyword
→ 之后数字写入就会冲突
ES 的 mapping 是 不可变的(字段类型定死后不能修改)。
如果不提前在模版里设定数据类型,后期需要调整就必须:
这会影响线上稳定性。
你的索引:
cdnclduser-default-10s-*cdnclduser-default-5m-*cdnclduser-vip1-10s-*cdnclduser-vip1-5m-*cdncld-common-10s-*cdncld-common-5m-*这些索引都是根据模版自动创建的。
如果要让这些索引都包含 request_time 字段,并且数据类型一致,就必须统一调整模版。
所以:
👉 新增字段 = 需要改模版,否则 ES 无法保证字段类型正确且一致。
答:字段不是固定的,但"字段的数据类型"一旦确定就固定了。
| 内容 | 是否可变 |
|---|---|
| 字段名 | 可以增加,但不能删除 |
| 字段类型 | 一旦定义后不可修改 |
| 字段的 analyzer(分词器) | 定义后不可修改 |
| 新字段 | 可继续添加 |
所以 ES 字段本身不是固定不变,但每个字段的类型是固定的。
你们要改模版,是为了让所有相关索引都能正确、新增地支持 request_time: double 字段,避免 ES 自动推断错误、字段类型冲突、以及各个索引不一致的问题。
如果你需要,我还可以帮你:
需要继续吗?
也就是我们 不写 request_time的类型的话,es 可能会自动调整成一个错的类型。
是的,你理解得完全正确 👍。
request_time 的类型,ES 会自动推断类型,而自动推断是可能出错的。ES 的自动 mapping 规则很简单:
"123"(字符串) → 可能映射成 text/keyword123(整数) → 映射成 long123.45(小数) → 映射成 float/double问题在于:
double但如果第一条数据不符合预期(例如写了整数,甚至写成字符串),ES 就会把字段类型“锁死”成错误的类型。例如:
"100" → ES 可能映射为 keyword100 → ES 可能映射为 long而 字段类型一旦被 ES 确定,就不能修改(除非重建索引)。
比如用 avg(request_time) 会报:
Fielddata is disabled on text fields
比如 ES 认为它是 long,你写入 0.123 会报错:
mapper_parsing_exception: failed to parse field [request_time] as double
像你们的多个索引:
如果自动推断不同步,就会导致 Kibana、Grafana 查询出错。
json"request_time": { "type": "double" }
这样所有未来创建的索引都会 保持一致、正确的类型。
是的,如果不写 mapping,ES 会自动推断类型,而自动推断极易推成错误的类型,因此必须在模板中明确声明。
如果你需要,我可以帮你生成对应的模版调整示例(基于你贴的索引前缀)。
我查了下es3里有cdncld-common-10s这个模板,没有5m的,es4里10s和5m的模板都没有
kibana 有这个索引的文档,但是模版里没有? 是因为 原来就没有创建模版吗
对,你现在看到的现象很正常,而且不一定是出了问题。我们拆开说一下👇
完全有可能是:当时压根就没用模板创建索引。
在 ES 里:
模板 ≠ 索引的必需条件
没模板,照样可以有索引、照样有数据。
所以现在你看到:
cdncld-common-10s-* 的模板,但 没有 5m 的cdncld-common-10s-*、cdncld-common-5m-* 的索引和文档说明的只是:当前 ES 中没有匹配这些索引前缀的模板,并不代表当时一定有模板。
当初有人直接:
bashPUT cdncld-common-10s-2025.01.01 { "mappings": { ... } # 可能写了,也可能没写,完全交给 ES 动态mapping }
或者更简单:应用程序直接往一个不存在的索引写数据:
bashPOST cdncld-common-10s-2025.01.01/_doc { ... }
→ ES 发现索引不存在,就自动创建索引
→ 再根据第一批文档自动推断字段类型(dynamic mapping)
这种情况下,从头到尾都没有模板存在,所以你现在在 _index_template 或 _template 里当然找不到。
一个时间线示意:
cdncld-common-10s-template,pattern 是 cdncld-common-10s-*cdncld-common-10s-2024.01.01 等结果:
所以你现在看到的“只有 10s 模板,没有 5m 模板”,也有可能是:
比如:
cdncld-common-templateindex_patterns 是:["cdncld-common-*"]cdncld-common-10s 这个关键字去可视化界面里搜索模板名cdncld-common-10s-* 和 cdncld-common-5m-* 的或者:
_index_template)_template),或者反了这种就是“看错地方/搜错名字”。
严格来说:已经很难 100% 还原历史,但可以大概推断:
看现在的所有模板中,是否有 pattern 能匹配这些索引名
bashGET _index_template GET _template
然后搜索 cdncld、common、10s、5m 等关键字,看有没有:
index_patterns 包含:cdncld-common-10s-*、cdncld-common-* 等查看索引的 mapping
bashGET cdncld-common-10s-*/_mapping GET cdncld-common-5m-*/_mapping
如果 mapping 看起来特别“规整”(字段类型非常统一、规范),有可能是当时用模板/脚本建的;
如果 mapping 很“天然”(很多字段自动长出来、类型有点乱),大概率当初就是靠 dynamic mapping。
跟团队问一下有没有历史改动记录
kibana 有这个索引的文档,但是模版里没有? 是因为 原来就没有创建模版吗
可能的情况有三种:
cdncld-*),你搜“10s/5m”看不到而已所以:
request_time: double)怎么处理?不问你要不要,我直接给一个推荐方案思路:
现在补一个统一的模板,覆盖:
cdncld-common-10s-*cdncld-common-5m-*mappings 里加上:json"request_time": { "type": "double" }
对于已存在的索引:
模板只会影响新创建的索引,不会自动改老索引
如果老索引里还没这个字段,可以用:
bashPUT cdncld-common-10s-2025.12.10/_mapping { "properties": { "request_time": { "type": "double" } } }
来显式补上这个字段类型(前提是还没被自动建成别的错误类型)
以后新建的日索引/滚动索引都会统一用这个 double 类型,避免再乱掉。
如果你愿意把现在某个索引的 _mapping 结构贴出来(删掉敏感字段名也行),我可以直接帮你判断当前是动态长出来的,还是当年明显用过模板的 😄
怎么在kibana 里面查看 索引 cdncld-common-5m-* 的模版?
在 Kibana 里查某个索引(如 cdncld-common-5m-*)到底匹配到哪个 Index Template,有两种正确方式:
GET _index_template/_resolve/cdncld-common-5m-*
返回结果里会出现类似:
json{ "index_templates": [ { "index_template": { "name": "cdncld-common-template", "index_patterns": [ "cdncld-common-*" ], "template": { "mappings": { ... }, "settings": { ... } } } } ] }
如果结果是空的:
json{ "index_templates": [] }
就说明:
➡️ 当前没有任何模板匹配 cdncld-common-5m-*
在 Kibana:
cdncld-common-5m-*这里会显示:
如果显示:
No index template applies to this index
那就说明:
➡️ 这个索引当初是自动创建的,没有使用任何模板。
如果你想 100% 确认是否真的没有模板匹配,方法 1(_resolve API)是最可靠的。
GET _index_template/_resolve/cdncld-common-5m-*
如果你愿意,你可以发给我这个命令的结果,我帮你解析:
我可以指导你创建正确的模板,确保 request_time 字段不会被自动推断成错误类型。
{
"error": {
"root_cause": [
{
"type": "index_not_found_exception",
"reason": "no such index",
"resource.type": "index_expression",
"resource.id": "_index_template",
"index_uuid": "na",
"index": "_index_template"
}
],
"type": "index_not_found_exception",
"reason": "no such index",
"resource.type": "index_expression",
"resource.id": "_index_template",
"index_uuid": "na",
"index": "_index_template"
},
"status": 404
}
这个回复是什么意思?
这个返回的核心意思是:你们这个 ES 集群不支持 _index_template 这套 API(Composable Index Template),所以 ES 把 _index_template 当成“索引名”去找了,结果当然找不到,于是报:
index_not_found_exceptionreason: "no such index"index: "_index_template"status: 404换句话说:
👉 不是你写错索引 pattern,也不是索引不存在,而是 ES 版本太老 / 只支持旧模板接口。
_index_template 和 _index_template/_resolve/... 是 ES 7.8+ 才有的“新模板体系”。
你们的 es3/es4 很可能还在:
所以这个 API 不存在 → 就会出现你看到的“no such index _index_template”。
在 Dev Tools 里跑:
httpGET _template
或只看相关的:
httpGET _template/cdncld*
cdncld-common-5m-*你可以用 cat 快速扫:
httpGET _cat/templates?v
然后人工看 index_patterns 里有没有:
cdncld-common-5m-*cdncld-common-*cdncld-*比如看到模板叫 cdncld-common-10s,就:
httpGET _template/cdncld-common-10s
旧 ES 没有 resolve API,只能间接判断:
取一个真实存在的索引名(不要用 *)
比如你 Kibana 里看到一个具体索引:
cdncld-common-5m-2025.12.10
查它的 mapping:
httpGET cdncld-common-5m-2025.12.10/_mapping
你这个报错 = 集群不支持 _index_template API。
接下来请用 _template / _cat/templates 去查 legacy 模板。
要不要你把下面两个命令的返回贴我一下,我帮你一眼看出有没有模板覆盖 5m?
httpGET _cat/templates?v GET _template/cdncld*
没有模版,可以后面补模版吗?
可以补,而且很常见。但要注意两件事:
1)补模板只对“未来新建的索引”生效;
2)已经存在的老索引不会自动被模板改掉。
我给你分开讲清楚怎么补、会发生什么、以及你们这种场景怎么做最稳。
你现在补一个 legacy 模板(ES6/老 ES7 用的 _template)是没问题的,比如:
httpPUT _template/cdncld-common-5m-template { "index_patterns": ["cdncld-common-5m-*"], "order": 10, "settings": { "number_of_shards": 3, "number_of_replicas": 1 }, "mappings": { "properties": { "request_time": { "type": "double" } } } }
以后只要有新索引名字符合 cdncld-common-5m-*,创建时就会自动带上 request_time: double。
比如你现在已经有:
cdncld-common-5m-2025.12.10
这个索引的 mapping 已经定了。
你现在补模板后,它不会回头再改老索引。
所以你会得到下面这种结果:
request_time: double看你老索引里现在有没有 request_time,以及它是不是被动态推断成了别的类型。
那很好办,直接给老索引补 mapping(只新增字段,不改已有字段):
httpPUT cdncld-common-5m-2025.12.10/_mapping { "properties": { "request_time": { "type": "double" } } }
✅ 这种是安全的,因为 ES 允许“新增字段”。
request_time 但类型错了比如已经被推断成了 long 或 keyword。
那就麻烦点:
ES 不允许改字段类型,只能:
方案 A:重建新索引 + reindex
方案 B:从现在开始新索引正确,老索引保持不动
如果老索引只是历史数据、查询里不会用到 request_time 聚合,也可以不动它。
但一旦跨索引聚合(比如 Kibana 里对 cdncld-common-5m-* 全量 avg)就可能报错。
你们要加统计字段 request_time,而且索引是滚动生成的(10s / 5m):
看现在是否已经出现httpGET cdncld-common-5m-*/_mapping
request_time 以及类型是什么可以后补模板,但只管未来新索引;老索引需要单独补 mapping,若类型已错只能 reindex。
你要是把某个具体 cdncld-common-5m-YYYY.MM.DD 的 _mapping 结果贴出来,我可以帮你判断老索引属于哪个情况、是否需要 reindex。
简单讲一下 模版的作用;补模版的作用,没有模版的影响;es版本会如何影响我们的使用? 如何在kibana 里面查es的版本?
行,我按你要的点,简单但讲清楚:
模板就是**“新索引创建时的默认说明书”**,主要管三件事:
字段类型(mapping)
例如提前规定:
request_time 必须是 double,status 是 keyword。
索引设置(settings)
比如分片数、副本数、refresh_interval、codec 等。
一些默认策略
老版本一般只管 mapping/settings;新版本还能组合组件模板、绑定 ILM 等。
重点:模板只在“索引创建那一刻”生效。
索引一旦创建,模板再改也不会回头影响它。
补模板的作用就是:
一句话:
补模板 = 从现在开始“规范化未来”。
没有模板时,ES 会走 dynamic mapping(动态映射):
带来的风险:
类型猜错
第一次写 "123" → 字段可能变成 keyword
以后你想 avg(request_time) 就会炸。
不同索引类型不一致
今天某个日索引猜成 long,明天另一个猜成 double
→ Kibana 跨索引聚合直接报错。
后期修复成本高 类型错了只能 reindex。
一句话:
没模板索引能用,但很容易“越用越乱”。
版本主要影响你能用哪些功能、以及 API 形式:
PUT/GET _template/..._index_template、_resolve 等比如:
一句话:
版本越老,越依赖 legacy 模板 + 动态 mapping,坑也更多。
Kibana 左侧:
Stack Management → About
里面会显示:
(不同页面布局略有差别,但 “About”/“Stack Overview” 都能看到。)
在 Dev Tools → Console 里输入:
httpGET /
返回里会有:
json{ "version": { "number": "6.8.23", ... } }
number 就是 ES 版本。
如果你愿意把 GET / 的结果贴一下,我可以直接告诉你:
_template 还是 _index_template{
"name": "miOrmF2",
"cluster_name": "internal-es3-deeplog",
"cluster_uuid": "qcWsssk_S5ejUB7huQDNJw",
"version": {
"number": "5.6.12",
"build_hash": "cfe3d9f",
"build_date": "2018-09-10T20:12:43.732Z",
"build_snapshot": false,
"lucene_version": "6.6.1"
},
"tagline": "You Know, for Search"
}
版本很低呀
是的,你们这个集群 Elasticsearch 5.6.12 —— 非常低的版本。
ES5 对模板、mapping、动态字段的限制都比较多,也缺少现代 ES 的很多安全特性。
我给你分点讲清楚这意味着什么,以及后续应该怎么做。
ES 5.x 在 2018 年就停止维护。
缺点包括:
你之前 _index_template/_resolve 报错,就是因为 ES5 完全不支持。
ES5 只能用 legacy 模板 API:
textPUT _template/xxx GET _template
ES5 的字段类型一旦自动推断:
所以如果你不设模板,动态 mapping 猜错类型 → 成本会极高。
ES5 自动推断逻辑比 ES7 更粗糙,比如:
"0.123"(字符串)→ 推成 keyword123 → 推成 long(但你需要 double)对于你们这种“统计字段场景”,风险非常大。
在高写入频率下(特别是你们的 10s/5m 索引),容易打爆集群。
可以,而且 必须补。
📌 模板对 ES5 同样有效,只是语法是 legacy 的:
textPUT _template/cdncld-common-5m-template { "template": "cdncld-common-5m-*", "order": 10, "mappings": { "properties": { "request_time": { "type": "double" } } } }
作用:
你的 ES5 会:
比如第一条数据是:
"request_time": "0.12"
ES5 会推成 keyword
以后就不能做 avg、sum、histogram 等 aggregations
举例:
然后你在 Kibana 做跨索引聚合:
cdncld-common-5m-* AND cdncld-common-10s-*
会直接报 mapping 冲突。
这会非常痛苦,特别是你们的日志量这么大。
可以解决 未来所有索引的字段规范问题:
但需注意:
你必须检查老索引的 mapping:
GET cdncld-common-5m-*/_mapping
情况有三种:
→ 最简单
可以直接给老索引补 mapping(ES5 允许新增字段):
textPUT cdncld-common-5m-2025.12.10/_mapping { "properties": { "request_time": { "type": "double" } } }
→ 无法修改
→ 只能 reindex(重建索引)
很多团队都直接选择:
那恭喜,可以直接补 mapping + 补模板。
_index_template,必须用 _template API你已经查出来了,就是:
GET /
返回:
"number": "5.6.12"
如果你愿意贴:
GET cdncld-common-5m-*/_mapping
我可以帮你判断:
你给我 mapping,我一分钟帮你分析。
ES5 的字段类型一旦自动推断:
永远不能修改
改字段类型必须 重建索引(reindex)
每个日志 的各个字段推出来的值 应该不一样吧?
你问得非常关键,这里很多人都会误解。
我给你讲清楚:自动推断(dynamic mapping)只发生一次,不是每条日志都重新推断一次。
字段类型不是每条日志推一次,而是“字段第一次出现时推断一次,之后就锁死”。
例如:
第一次写入的文档:
json{ "request_time": "0.123" }
ES5 会自动推断:
request_time → keyword (字符串)
从此之后:
你说的没错:“每条日志的字段实际值可能不同”
但 ES 只关心字段的数据类型,而不是具体值。
例如:
你写下面几条:
text0.1 1 3.1415 0
这些值当然不同,但它们的类型应该都是 double。
ES 的要求是:
同一个字段(在同一个索引里)必须有一致的数据类型。
例如第一次写成字符串类型:
"request_time": "0.32"
ES5 推断成:
request_time → keyword
后面你写:
"request_time": 0.55
就会报错:
textmapper_parsing_exception: failed to parse field [request_time] of type [keyword]
因为 ES5 无法接受字段类型变化。
假设你有:
然后你在 Kibana 做跨索引聚合:
cdncld-common-5m-*
直接报 mapping conflict:
Field [request_time] has different types in different indices: [keyword], [long], [double]
所以你们现在的问题 非常典型且危险:
模板会告诉 ES:
request_time → double
那么:
ES 都必须把 request_time 当成 double 解析,避免混乱。
模板 = 约束 = 保证所有索引一致。
| 你提出的误解 | 实际真相 |
|---|---|
| 每条日志的字段都重新推断类型 | ❌ ES 只在“字段第一次出现”时推断一次,然后类型锁死 |
| 日志值不同是否影响类型 | ❌ 值可以不同,但类型必须统一 |
| 没模板也能用 | ✔ 能用,但风险极大:类型会乱、跨索引聚合会炸 |
| ES5 能改字段类型吗 | ❌ 不能;只能 reindex |
如果你愿意,我可以帮你一步步设计模板补救方案,包括:
你可以贴一个实际索引的 mapping(GET cdncld-common-5m-*/_mapping),我帮你判断现在到底有多乱。
cdnclduser-default-5m-2025-12-10 也就是这个索引 第一次输入以后, 以后写在这个索引底下的文档,对应字段的格式就已经确定了吗?
对,就是这个意思:一旦 cdnclduser-default-5m-2025-12-10 这个索引被创建出来,并且某个字段在这个索引里“第一次出现”时被 ES(dynamic mapping)确定了类型,那么在这个索引里该字段类型就固定了。
更具体点:
cdnclduser-default-5m-2025-12-10 写入文档时,如果 ES 发现某个字段(比如 request_time)在 mapping 里还不存在:
注意一个细节:
request_time 字段,那 ES 不会为它建立 mapping;等到某条文档第一次带上 request_time 时才会推断并固定。另外也提醒你一条你们场景里很常见的坑:
...-2025-12-11),在没有模板约束时,不同索引里同字段可能被推断成不同类型,Kibana 跨索引查 cdnclduser-default-5m-* 就容易冲突。为什么这两者 是比较好的组合?
我需要先确认一下你说的 “这两者” 指的是什么组合,才能给你准确解释。
因为在我们前面的对话里,可能有多种“两者组合”:
这些都可能被理解为“两者”。
👉 为了不误解,请你告诉我:你说的“这两者”具体是指哪两项?
你可以直接复制你指的那一段,我就能马上解释为什么它们是“比较好的组合”。
es 和 kibana? 如果没有es 一般是如何 查es的数据的?
明白了,你问的是:
为什么「ES(Elasticsearch)+ Kibana」是比较好的组合?
如果没有 Kibana,一般又是如何查询 ES 里的数据?
我给你用最容易理解的方式讲清楚👇
因为它们分别负责数据系统里的两个核心部分:
ES 的强项:
ES = 搜索引擎 + 时序数据存储 + 分布式日志库
Kibana 的强项:
Kibana = ES 的前端界面 + 数据可视化平台
因为 它们互补:
| 组件 | 能力 | 缺点 |
|---|---|---|
| Elasticsearch | 强大的搜索、聚合、存储 | 不适合人类直接操作,没有图形界面 |
| Kibana | 可视化、查询界面、管理 ES | 自己不存数据,需要依赖 ES |
就像:
👉 ES 存和算,Kibana 展示和操作 → 完整的闭环
所以全世界(ELK Stack)都这样搭配:
📦 E = Elasticsearch
📦 L = Logstash(或 beats)
📦 K = Kibana
Kibana 只是一个“图形界面”,不是必须的。
没有 Kibana,你仍然可以查 ES:
这是最原始的方法,也是 Kibana 背后做的事。
示例:
bashGET log-2025.12.10/_search { "query": { "match": { "user": "nancy" } } }
返回的 JSON 就是数据。
缺点: 没有 UI、不好看、不方便浏览大量日志。
例如 Python:
pythonfrom elasticsearch import Elasticsearch es = Elasticsearch("http://localhost:9200") res = es.search(index="log-*", body={"query": {"match_all": {}}}) print(res)
一般做应用程序、自动化 ETL、监控工具时用这种方式。
比如:
但这些都是为了更好地用 ES,本质上还是对 ES 进行查询。
ES 的数据被 Lucene 文件结构管理(倒排索引、doc values)。
没有完善的查询解析能力,你没办法直接读里面的数据。
所以:
👉 想查数据只能通过 ES API 或基于它的 UI(如 Kibana)。
因为:
二者结合 = 用起来最舒服、最完整的日志/时序搜索方案。
你仍然可以查 ES:
但 没有 Kibana 会很不方便:
所以 Kibana == ES 的“可视化大脑”。
如果你愿意,我还能给你讲:
你要继续了解吗?
GET log-2025.12.10/_search
{
"query": {
"match": {
"user": "nancy"
}
}
}
kibana 这里的语法 规则是不是 对es 也能直接使用?
是的,你看到的 Kibana 示例语法:
jsonGET log-2025.12.10/_search { "query": { "match": { "user": "nancy" } } }
这套语法本质上就是 Elasticsearch 的原生 DSL(Query DSL)和 REST API。
所以答案是:
也就是说:
👉 你在 Kibana Dev Tools 里写的所有语法,都可以直接用 curl / Postman / 程序语言 调 ES,也完全兼容 ES。
因为 Kibana Console(Dev Tools)只是一个“API 调试器”:
所以:
Kibana Dev Tools = Elasticsearch 的 HTTP API 客户端
你在 Kibana 里执行:
jsonGET index/_search { ... }
等价于你在命令行执行:
bashcurl -XGET "http://localhost:9200/index/_search" -H 'Content-Type: application/json' -d' { "query": { "match": { "user": "nancy" } } }'
以下内容都是完全兼容 ES API 的:
| 操作 | Kibana Console | ES 原生 API |
|---|---|---|
| 查询 | GET index/_search | ✔ 完全一致 |
| 创建索引 | PUT index | ✔ 完全一致 |
| 改 template | PUT _template/... | ✔ 完全一致 |
| 查 mapping | GET index/_mapping | ✔ 完全一致 |
| 多行语句执行 | Kibana 会自动拆分 | ✔ 支持 |
Kibana Console 支持一种“快捷写法”:
textGET index/_search { ... }
而 curl 要写成:
curl -X GET ... -d '{ ... }'
但本质上内容完全相同。
Kibana Console 的语法 = Elasticsearch 原生查询 DSL,所以你写的任何查询都能直接用在 ES API 中。
你可以把 Kibana Dev Tools 当成一个 ES API 的 Playground。
如果你想,我可以进一步教你:
你需要吗?
那你觉得小白 要从哪几个方面了解kibana + es 呢? 哪些es 的常规命令; 要了解 es 有哪些功能和优势吗
下面我给你整理一套 “小白快速入门 ES + Kibana 应该掌握哪些方面” 的清晰学习路径,既不会太重,也能覆盖实际工作中最常用、最关键的内容。
至少要理解这些:
ES = 分布式搜索引擎 + 日志存储 + 高速聚合计算引擎
它适合做:
必须掌握:
理解这些,你就能搞明白 ES 为什么会推断字段类型、为什么类型不能改。
Kibana 是操作 ES 最友好的方式,小白学习 Kibana 重点分三块:
最常用、最需要会的功能。
你可以练习:
这是深入 ES 的核心技能。
理解:图表本质上是 ES 聚合(aggregations)。
以下是工作中最常用、90% 场景都够用的命令,小白必须掌握:
jsonGET index/_search { "query": { "match": { "user": "nancy" } } }
jsonGET index/type/id
jsonPOST index/type { ... }
jsonGET index/_mapping
jsonPUT index/_mapping { "properties": { "new_field": { "type": "keyword" } } }
jsonPUT _template/template-name { "template": "log-*", "mappings": { "properties": { "rt": { "type": "double" } } } }
GET _cat/indices?v
GET _template
PUT index-name
GET /
这些是 ES 为什么这么流行的原因,小白必须知道:
比数据库 LIKE 查询快几十倍。
比传统数据库更适合海量日志写入。
数据量上百 TB 也可以水平扩展。
可以做:
这使得 Kibana 可以做各种图表。
灵活,但也要谨慎——否则字段乱推断(你现在踩到的坑)。
(上面已经列好)
学完这四步,你基本就能在团队里独立处理日志、排查问题、查看 mapping、做简单查询了。
要不要我给你整理一份?