刚学 ES 时,我把 Mapping 当 MySQL 的表结构用,结果被同事笑了

发布时间:2026/11/2 10:25:25

刚学 ES 时,我把 Mapping 当 MySQL 的表结构用,结果被同事笑了 我们是由枫哥组建的IT技术团队成立于2017年致力于帮助IT从业者提供实力成功入职理想企业我们提供一对一学习辅导由知名大厂导师指导分享Java技术、参与项目实战等服务并为学员定制职业规划全面提升竞争力过去8年我们已成功帮助数千名求职者拿到满意的OfferIT枫斗者、IT枫斗者-Java面试突击。 刚学 ES 时我把 Mapping 当 MySQL 的表结构用结果被同事笑了“索引是房子Mapping 是户型图——但 ES 的’户型图’会直接影响你能不能搜到数据。”前言ES 入门最容易踩的坑刚接触 Elasticsearch 时我被索引、Mapping、文档这些概念绕晕了。我当时的理解索引 MySQL 的表 ✅Mapping MySQL 的表结构 ✅文档 表里的一行数据 ✅看起来没问题直到我写了一个查询搜不到数据才发现 Mapping 不是表结构那么简单。今天这篇文章用MySQL 思维做类比帮你建立直觉同时讲清楚 ES 独有的坑。建议先收藏 ⭐下次建索引前复习一遍。一、一句话总结索引和 Mapping 到底是什么ES 概念MySQL 类比核心作用索引Index表Table数据放在哪Mapping表结构CREATE TABLE数据怎么存、怎么搜文档Document一行记录Row具体的数据内容关键区别MySQL 的表结构只管怎么存ES 的 Mapping 还管怎么搜——字段类型直接决定搜索行为。二、实战从代码看索引和 Mapping 怎么配合2.1 连接 ES 并创建索引// main.gopackagemainimport(fmtmy-go-project/es/coremy-go-project/es/globalmy-go-project/es/indexs)funcmain(){core.EsConnect()// 连接 ESfmt.Println(global.ESClient)indexs.CreateIndex()// 创建索引}2.2 创建索引的核心逻辑// indexs/create.gopackageindexsimport(contextfmtmy-go-project/es/globalmy-go-project/es/models)funcCreateIndex(){createIndex,err:global.ESClient.CreateIndex(user_index).// ← 索引名 表名BodyString(models.UserModel{}.Mapping()).// ← Mapping 表结构Do(context.Background())iferr!nil{fmt.Println(err)return}fmt.Println(✅ 索引创建成功)}关键代码BodyString(models.UserModel{}.Mapping())把 Go 结构体里定义的 Mapping 规则传给 ESES 按这些规则创建索引。三、Mapping 详解不只是字段类型3.1 完整 Mapping 定义// models/user.gopackagemodelsimporttimetypeUserModelstruct{IDuintjson:idUserNamestringjson:user_nameNickNamestringjson:nick_nameCreatedAt time.Timejson:created_at}func(UserModel)Mapping()string{return{ mappings: { properties: { nick_name: { type: text // ← 全文搜索会分词 }, user_name: { type: keyword // ← 精确匹配不分词 }, id: { type: integer }, created_at: { type: date, null_value: null, format: yyyy-MM-dd HH:mm:ss } } } }}3.2 字段类型对比text vs keyword最容易搞混类型是否分词适用场景典型查询text✅ 分词全文搜索、模糊匹配match查询keyword❌ 不分词精确匹配、聚合排序term查询实战演示// 写入文档{nick_name:张三同学,// text 类型user_name:zhangsan// keyword 类型}查询行为对比// ✅ 能搜到text 类型分词后匹配{query:{match:{nick_name:张三// 分词后 张三 匹配成功}}}// ❌ 搜不到keyword 类型必须完全匹配{query:{term:{user_name:zhang// keyword 不分词zhang ≠ zhangsan}}}// ✅ 能搜到keyword 类型精确匹配{query:{term:{user_name:zhangsan// 完全匹配}}}⚠️经典踩坑把本该用keyword的字段设成text然后用term查询——永远搜不到。四、为什么 Mapping 比 MySQL 的表结构更重要4.1 MySQL表结构只管怎么存CREATETABLEusers(idINT,user_nameVARCHAR(255),nick_nameTEXT,created_atDATETIME);VARCHAR和TEXT对查询行为影响很小搜索时用LIKE %关键词%就行4.2 ESMapping 直接决定能不能搜到Mapping 类型底层索引方式支持的查询text倒排索引分词后match、multi_match、query_stringkeyword倒排索引不分词term、terms、range、聚合integerBKD 树term、rangedate毫秒时间戳range、date_histogram同一个字段类型不同底层索引完全不同支持的查询也完全不同。4.3 自动推断的坑如果不手动定义 MappingES 会自动推断// 写入第一条数据{user_name:zhangsan}// ES 自动推断user_name → text keyword多字段// 实际 Mapping{user_name:{type:text,fields:{keyword:{type:keyword,ignore_above:256}}}}问题自动推断可能不符合预期日期格式识别错误2026-05-01被当字符串数值被当字符串导致range查询失效最佳实践先设计 Mapping再写入数据。五、完整流程从连接到查询┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ 连接 ES │────▶│ 创建索引 │────▶│ 定义 Mapping │ │ EsConnect() │ │ CreateIndex() │ │ BodyString(...) │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ ▼ ┌─────────────────┐ │ ES 按规则建索引 │ │ - id: integer │ │ - user_name: keyword │ - nick_name: text │ - created_at: date └─────────────────┘ │ ▼ ┌─────────────────┐ │ 写入文档 │ │ IndexDocument() │ └─────────────────┘ │ ▼ ┌─────────────────┐ │ 搜索/聚合 │ │ Search/Aggs │ └─────────────────┘六、常见面试题 实战技巧Q1text 和 keyword 怎么选场景推荐类型原因用户昵称搜索text需要分词匹配张三、“同学”用户名登录keyword必须精确匹配 “zhangsan”邮箱搜索keyword精确匹配不分词文章标题textkeyword既要全文搜又要精确排标签/分类keyword聚合统计用IP 地址ip专用类型支持网段查询多字段方案一个字段两种用途{mappings:{properties:{title:{type:text,// ← 用于全文搜索analyzer:ik_max_word,fields:{keyword:{type:keyword,// ← 用于精确匹配、排序、聚合ignore_above:256}}}}}}查询时// 全文搜索{match:{title:Elasticsearch}}// 精确匹配{term:{title.keyword:Elasticsearch 实战}}// 排序{sort:[{title.keyword:asc}]}Q2Mapping 能修改吗操作是否支持说明新增字段✅PUT /index/_mapping修改字段类型❌必须重建索引删除字段❌必须重建索引修改 analyzer❌必须重建索引重建索引流程# 1. 创建新索引新 MappingPUT /user_index_v2{mappings:{...}}# 2. 数据迁移POST /_reindex{source:{index:user_index},dest:{index:user_index_v2}}# 3. 切换别名POST /_aliases{actions:[{remove:{index:user_index,alias:user}},{add:{index:user_index_v2,alias:user}}]}Q3怎么查看已有索引的 Mapping# 查看 MappingGET /user_index/_mapping# 查看 Settings分片、副本等GET /user_index/_settings七、总结一张表搞定核心概念ES 概念MySQL 类比核心差异注意事项IndexTable分布式存储分片机制索引名小写不能用特殊字符MappingCREATE TABLE字段类型决定搜索行为必须先定义不要依赖自动推断DocumentRowJSON 格式无固定结构同一索引的文档建议结构一致textTEXT会分词支持全文搜索不能用term查询keywordVARCHAR不分词精确匹配不能用match查询dateDATETIME支持多种格式必须指定format⭐️推荐:Offer训练营介绍Java 面试 后端通用面试八股文Java后端企业级实战面试Java后端校招算法学习
延伸阅读

更多相关文章

2026/10/29 23:39:46

Video2X 从入门到上手:完成你的第一个 4K 视频超分辨率

Video2X 从入门到上手:完成你的第一个 4K 视频超分辨率 【免费下载链接】video2x A machine learning-based video super resolution and frame interpolation framework. Est. Hack the Valley II, 2018. 项目地址: https://gitcode.com/GitHub_Trending/vi/vide…

2026/11/2 10:20:53

Paperclip视频制作全攻略:从AI生成到复古字幕渲染

"Paperclip",一枚回形针。在现实世界里,它是办公桌上最不起眼的小东西:两根钢丝弯两下,把一堆乱七八糟的纸夹在一起。但在最近的网络热词序列里,同一个词却指向了一种完全不同的玩法——一条条AI生成的离谱画…

2026/11/2 10:20:53

VoiceStudio个人语音制作工作流:从录人声到标准化全链路实操指南

要做白话分享的是近半年我把一套个人语音制作工作流整套理顺的全过程,最终名字就叫 VoiceStudio。这个项目本质上是把一个很窄的需求——录人声、做音频后期、输出标准化音频内容——做扎实,从麦克风前级的物理链路一路打通到响度标准,最终形…

2026/11/2 10:20:53

安桥NR906功放接线校准全攻略:从接口到声场调校

简介:这份资源是安桥NR906 AV功放的官方说明书压缩包,面向已入手或计划调试该型号功放的家庭影院用户与音响爱好者,帮助解决初始设置、网络配置、音视频调校及日常故障排查等实际问题。包内共2个文件,以PDF技术手册与HTM说明页为主…

2026/11/2 10:20:53

介电弹性体驱动器PID控制:电压平方项、延迟与积分饱和实战

简介:围绕介电弹性体驱动器(DEA)PID控制与Matlab/Simulink仿真的PDF文档,面向从事智能材料驱动、非线性控制与机电系统建模的研究生、工程师及课程学习者,重点解决DEA电压驱动下强非线性、普通PID易振荡及参数整定困难…

2026/11/2 10:15:52

AI模型能力错位现象分析与优化策略

1. 人工智能系统的错位现象本质剖析 当我们在2023年测试GPT-4的多轮对话能力时,发现一个有趣现象:模型在回答简单数学题时准确率高达98%,但在处理需要多步推理的复杂应用题时,错误率却陡增至42%。这个典型案例揭示了AI系统普遍存在…

2026/11/2 6:08:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/2 6:39:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 1:04:04

工业级SPI隔离设计:硬件抗扰与信号完整性实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 1:04:04

PLFM_RADAR:主动探测数据通道,构建低误报的数据感知系统

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 1:04:04

工业SPI隔离设计:MAX14431与STM32F746硬件抗干扰实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 6:08:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/2 6:39:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑