发布时间:2026/9/6 23:43:34
刚学 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/9/6 23:38:34

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/9/7 0:03:37

2026 AI视觉与物联网开发板选购指南:从MCU到Jetson的档位解析

2026 年已经过了一大半,如果你现在正准备入手 AI 视觉或物联网开发板,我建议你先别急着下单。市面上从几十块的 ESP32 到几千块的英伟达 Jetson,价格差了近百倍,宣传话术却几乎一样,都告诉你“能跑 AI、能做视觉、能搞…

2026/9/7 0:03:37

基于Vue的企业门户网站管理系统的设计与实现

目 录 摘 要 Abstract 目 录 1 引言 1.1 选题背景 1.2 研究现状 1.3 目的和意义 1.4 论文结构安排 1.5本章小结 2 开发环境与技术 2.1 MySQL数据库 2.2 Java语言技术 2.3 Spring Boot框架 2.4 Vue.js 2.5 本章小节 3 系统分析 …

2026/9/7 0:03:36

BS EN 13814-1-2019游乐设施安全标准:设计与制造核心要点解析

简介:BS EN 13814-1:2019是英国采纳欧洲标准EN 13814-1:2019的正式版本,由BSI标准出版,重点规定游乐设施和游乐设备在设计与制造环节的安全准则,与BS EN 13814-2:2019、BS EN 13814-3:2019共同取代旧版BS EN 13814:2004。该标准面…

2026/9/7 0:03:36

UL 1642锂电池安全标准全解析:测试项目、认证流程与避坑指南

简介:UL 1642是锂电池安全领域的重要规范,本中文版资源适合锂电池制造商、检测机构工程师及产品认证相关人员阅读,用于理解电池在设计与制造层面的安全要求、测试方法与合规要点。资源共1个PDF文件,压缩包大小834KB,便…

2026/9/7 0:03:36

基于YOLOv8和PyQt5的麦穗稻穗检测识别系统设计与实现

这次我们来看一个把目标检测算法和桌面端工具结合得很典型的项目:基于 YOLOv8 PyQt5 的麦穗稻穗检测识别系统。这个项目本身不是新概念,但它的价值在于落地形态很完整。YOLOv8 负责核心的麦穗稻穗目标检测,PyQt5 负责提供可视化的桌面交互界…

2026/9/6 23:58:36

S698-T处理器上RTEMS移植与开发实战

简介:文档围绕S698-T处理器上的RTEMS实时操作系统移植与应用程序开发展开,定位为航天嵌入式领域的专业技术文献,适合嵌入式实时系统开发者、航天器电子系统工程师及相关专业研究生阅读参考。文档以构建星载计算机模型为背景,论证了…

2026/9/7 0:47:43

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/7 0:14:19

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/7 0:14:17

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/7 0:03:36

基于YOLOv8和PyQt5的麦穗稻穗检测识别系统设计与实现

这次我们来看一个把目标检测算法和桌面端工具结合得很典型的项目:基于 YOLOv8 PyQt5 的麦穗稻穗检测识别系统。这个项目本身不是新概念,但它的价值在于落地形态很完整。YOLOv8 负责核心的麦穗稻穗目标检测,PyQt5 负责提供可视化的桌面交互界…

2026/9/7 0:03:36

UL 1642锂电池安全标准全解析:测试项目、认证流程与避坑指南

简介:UL 1642是锂电池安全领域的重要规范,本中文版资源适合锂电池制造商、检测机构工程师及产品认证相关人员阅读,用于理解电池在设计与制造层面的安全要求、测试方法与合规要点。资源共1个PDF文件,压缩包大小834KB,便…

2026/9/7 0:03:36

BS EN 13814-1-2019游乐设施安全标准:设计与制造核心要点解析

简介:BS EN 13814-1:2019是英国采纳欧洲标准EN 13814-1:2019的正式版本,由BSI标准出版,重点规定游乐设施和游乐设备在设计与制造环节的安全准则,与BS EN 13814-2:2019、BS EN 13814-3:2019共同取代旧版BS EN 13814:2004。该标准面…

2026/9/6 11:40:10

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/6 19:33:50

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/6 10:19:40

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…