在 Elasticsearch 中,数据建模与映射(Mapping) 是决定搜索性能、存储效率和功能支持的核心环节。合理的映射设计能让搜索更精准、聚合更高效、存储更节省。

本文将全面详解 Elasticsearch 的 数据建模原则、字段类型、动态映射、自定义分析器、嵌套结构、最佳实践 等关键内容。


一、什么是映射(Mapping)?

映射(Mapping) 是 Elasticsearch 中对索引结构的定义,类似于关系型数据库中的 Schema。它描述了:

  • 每个字段的名称和数据类型;
  • 是否分词(用于全文搜索);
  • 是否索引(可被搜索);
  • 如何处理日期、数字、对象等复杂类型。

✅ 每个索引都有一个 mapping,定义其文档结构。


二、映射的核心组成

一个完整的 mapping 包含:

{"mappings": {"properties": { ... },        // 字段定义"dynamic": true,              // 动态映射策略"date_detection": true,       // 是否自动检测日期"numeric_detection": false,   // 是否自动检测数字"_source": { "enabled": true }, // 是否存储原始 JSON"routing": { "required": false }}
}

三、字段类型详解(Field Types)

Elasticsearch 支持丰富的字段类型,选择合适的类型至关重要。

1. 常用字段类型

类型用途是否分词示例
text全文搜索(会分词)"这是一段中文文本"
keyword精确匹配、聚合、排序"status:active"
date日期类型-"2024-06-01T10:00:00Z"
long, integer, short, byte整数-100, -5
double, float浮点数-3.14
boolean布尔值-true, false
ipIP 地址-"192.168.1.1"
geo_point地理位置坐标-{"lat": 39.9, "lon": 116.4}
object嵌套 JSON 对象-{"name": "张三", "age": 30}
nested独立索引的嵌套对象-数组中的对象列表
binary二进制数据(Base64)-图片缩略图
flattened将复杂 JSON 作为 keyword 处理动态标签

2. text vs keyword:最重要的选择

场景推荐类型
搜索商品标题text
聚合品牌、分类keyword
排序价格、时间keyword 或数值类型
精确匹配订单号keyword

最佳实践:对同一字段使用 多字段(multi-fields)

"title": {"type": "text","analyzer": "ik_max_word","fields": {"keyword": { "type": "keyword" }}
}
  • 搜索用 title
  • 聚合/排序用 title.keyword

四、动态映射(Dynamic Mapping)

1. 什么是动态映射?

当插入一个新字段时,Elasticsearch 自动推断其类型并添加到 mapping 中。

PUT /my-index/_doc/1
{"user": "张三",      → 推断为 text + keyword"age": 30,          → 推断为 long"created": "2024-06-01" → 推断为 date
}

2. 动态策略(dynamic

设置说明
true(默认)自动添加新字段
false忽略新字段,不报错
strict拒绝未知字段,抛出异常

✅ 生产环境建议设为 strict,防止字段污染。

PUT /my-index
{"mappings": {"dynamic": "strict","properties": { ... }}
}

五、自定义分析器(Analyzer)

用于控制 text 字段的分词方式,直接影响搜索结果。

1. 分析器组成

  • Character Filters:预处理(如 HTML 标签过滤)
  • Tokenizer:分词器(如空格、中文分词)
  • Token Filters:后处理(小写、停用词)

2. 示例:中文分词配置

PUT /news
{"settings": {"analysis": {"analyzer": {"my_ik_analyzer": {"type": "custom","tokenizer": "ik_max_word","filter": ["lowercase"]}}}},"mappings": {"properties": {"content": {"type": "text","analyzer": "my_ik_analyzer"}}}
}

3. 常见中文分词插件

  • ik:最常用,支持自定义词典
  • jieba:Python 社区流行
  • smartcn:官方提供,功能有限

六、复杂结构建模

1. object 类型(扁平化对象)

{"address": {"city": "北京","district": "朝阳区"}
}

映射:

"address": {"properties": {"city": { "type": "keyword" },"district": { "type": "keyword" }}
}

⚠️ 内部字段是扁平化的:address.cityaddress.district 是独立字段。


2. nested 类型(独立索引的对象)

适用于数组中的对象,需保持内部关系。

示例:用户评论
{"comments": [{ "user": "A", "content": "好", "likes": 10 },{ "user": "B", "content": "差", "likes": 1 }]
}

错误方式(object):

"comments": {"properties": { ... }
}

→ 会匹配 "user:A AND content:差"(跨文档匹配)

正确方式(nested):

"comments": {"type": "nested","properties": {"user": { "type": "keyword" },"content": { "type": "text" },"likes": { "type": "integer" }}
}

查询:

"query": {"nested": {"path": "comments","query": {"bool": {"must": [{ "match": { "comments.user": "A" } },{ "match": { "comments.content": "好" } }]}}}
}

3. join 类型(父子文档)

用于一对多关系(如文章与评论),但性能较低。

"relation": {"type": "join","relations": {"post": "comment"}
}

⚠️ 7.x 后推荐用 nested 或应用层关联。


七、高级映射设置

1. _source 控制

  • 是否存储原始 JSON,默认 true
  • 设为 false 可节省空间,但无法:
    • 获取原始文档
    • 使用 update API
    • 高亮、脚本字段
"_source": { "enabled": false }

2. doc_valuesfielddata

  • doc_values: true(默认):列式存储,用于排序、聚合(推荐开启)
  • fielddata:用于 text 字段聚合,消耗大,不推荐
"tags": {"type": "text","fielddata": true  // 仅在必须时启用
}

3. index 设置

控制字段是否可被搜索:

"internal_id": {"type": "keyword","index": false  // 不参与搜索,仅存储
}

八、数据建模最佳实践 ✅

场景建议
文本搜索使用 text + 中文分词器(如 ik)
聚合/排序使用 keyword 或数值类型
多字段使用 fields 定义 text + keyword
动态字段生产环境设为 strict
嵌套对象使用 nested 保持关系
日期使用 date 类型,格式统一
大字段index: false 节省空间
冗余设计适当反规范化提升查询性能

九、反规范化 vs 正规范化

策略说明适用场景
反规范化(Denormalization)将关联数据冗余存储查询频繁、写少
正规范化(Normalization)拆分为多个索引,通过 join 查询数据一致性要求高

✅ Elasticsearch 推荐 适度反规范化,以提升查询性能。


十、总结:映射设计 checklist

项目是否完成
使用 text 用于全文搜索
使用 keyword 用于聚合排序
中文字段配置 IK 分词器
关键字段启用 doc_values
嵌套对象使用 nested
生产环境 dynamic: strict
_source 根据需求启用
避免 fielddata on text

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/93451.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/93451.shtml
英文地址,请注明出处:http://en.pswp.cn/web/93451.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5G工业一体机汽车零部件工厂的无纸化管理

在全球数字化转型的浪潮中,制造业对信息化、智能化的需求日益强烈。尤其是在汽车零部件领域,生产线的复杂性、质量追溯的苛刻性以及对效率的高要求,迫切需要一种高效、可靠、可扩展的管理模式。以“5G工业一体机”为核心的无纸化管理&#xf…

项目管理工具

1、概述IT 项目生命周期通常可分为启动、规划、执行、监控与控制、收尾五个核心阶段,每个阶段的目标和任务不同,所依赖的工具也各有侧重。以下按阶段梳理常用工具,涵盖项目管理、协作、技术开发等多个维度。2、启动阶段:明确项目目…

Linux 进程、线程与 exec/系统调用详解

1. wait 与 waitpid —— 子进程资源回收1.1 waitpid_t wait(int *wstatus);功能:阻塞等待,回收任意子进程的资源空间。参数:wstatus:保存子进程退出状态的变量地址NULL:不保存退出状态返回值:成功&#xf…

Laravel 使用ssh链接远程数据库

1.创建ssh ssh -i ./id_rsa -N -L 13306:127.0.0.1:3306 -p 22 root***对上述代码的解释: 命令是一个SSH隧道命令,用于将本地端口3306转发到远程服务器上的3306端口。以下是命令的详细解释:# 调用SSH客户端。 ssh # 指定用于身份验证的私钥文…

Python延申内容(一)

1.技术面试题 (1)TCP与UDP的区别是什么? 答: TCP(传输控制协议):面向连接、可靠传输(数据完整有序)、流量控制、拥塞控制,适用于文件传输、网页浏览等场景。 …

Java 9 新特性及具体应用

目录 1. 模块系统(Jigsaw) 2. JShell(REPL工具) 3. 集合工厂方法 4. 接口私有方法 5. Stream API 增强 6. HTTP/2 客户端(Incubator) 7. 多版本JAR包 总结 1. 模块系统(Jigsaw&#xff0…

第二十五天:构造函数/析构函数/拷贝构造

构造函数/析构函数/拷贝构造 1. 构造函数(Constructor) 定义与作用:构造函数是一种特殊的成员函数,其名称与类名相同,没有返回类型(包括 void 也没有)。它的主要作用是在创建对象时初始化对象的…

【P14 3-6 】OpenCV Python——视频加载、摄像头调用、视频基本信息获取(宽、高、帧率、总帧数),视频保存在指定位置

文章目录1 读取本地视频1.1 绝对路径 6种方式1.2 相对路径 4种方式1.3 读取本地视频2 视频基本信息3 调用摄像头 并将视频保存在指定位置P14 3-6 1 读取本地视频 现在要读取本地视频“video.mp4”, 视频文件“video.mp4”和playVideo.py脚本文件,都在…

【DL学习笔记】常用数据集总结

一、如何找数据集 paperswithcode,但好像没了 AutoDL Roboflow Kaggle Hungging Face 百度飞浆PP AIStudio 二、目标检测数据集格式 常用数据集坐标格式 MSCOCO : 坐标格式(x,y,w,h&#xff…

19.3 Transformers量化模型极速加载指南:4倍推理加速+75%显存节省实战

Transformers量化模型极速加载指南:4倍推理加速+75%显存节省实战 实战项目:模型量化 Transformers 兼容性配置 量化模型加载核心配置逻辑 #mermaid-svg-rDjfMigtxckLYWp3 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#merm…

Android 终端接入 GB28181 国标视频平台的完整解决方案解析

1. 引言:让 Android 终端无缝融入国标视频网络在公安、交通、应急、工业、教育等领域,GB/T 28181 国标协议早已成为视频监控与指挥调度的事实标准。传统国标视频网络通常由固定部署的 IPC 摄像机、NVR、视频管理平台构成,设备形态单一。随着一…

Docker目录的迁移

# 迁移 docker 目录 (无论容器与镜像占用空间大小,哪怕只占用1G,也需用此方式,否则可能迁移不成功)service docker stopcd /var/lib/docker# 一个一个复制除 overlay2 外的其他所有文件夹cp -R builder /home/docker/l…

IOS APP 前端存储

UserDefaults优点简单易用提供简单的键值对存储接口无需复杂配置,开箱即用适合存储少量简单数据轻量级专门为存储小量数据设计内存占用小性能开销低自动持久化数据自动保存到磁盘应用重启后数据仍然可用通过synchronize()方法可以强制立即写入(iOS 12已自…

在前端js中使用jsPDF或react-to-pdf生成pdf文件时,不使用默认下载,而是存储到服务器

开源地址: https://github.com/ivmarcos/react-to-pdf 主要就是这个方法,有三种可选: 默认是save,也就是会自动触发下载的方法,open方法是默认会打开一个pdf预览的tab页面,build方法就是在调用的函数gener…

会议征稿!IOP出版|第二届人工智能、光电子学与光学技术国际研讨会(AIOT2025)

往届已EI检索,欢迎投稿! AIOT2024会后两个月实现见刊! AIOT2025已通过IOP-JPCS出版申请,独立JPCS出版 AIOT2025已上线西安文理学院官网: 征文通知|第二届人工智能、光电子学与光学技术国际…

CPP多线程2:多线程竞争与死锁问题

在多线程编程中,多个线程协同工作能显著提升程序效率,但当它们需要共享和操作同一资源时,潜在的问题也随之而来;线程间的执行顺序不确定性可能导致资源竞争,可能引发死锁,让程序陷入停滞。 多线程竞争问题示…

全国产飞腾d2000+复旦微690t信号处理模块

UD VPX-404是基于高速模拟/数字采集回放、FPGA信号实时处理、CPU主控、高速SSD实时存储架构开发的一款高度集成的信号处理组合模块,采用6U VPX架构,模块装上外壳即为独立整机,方便用户二次开发。 UD VPX-404模块的国产率可达到100%&#xff0…

物联网 (IoT) 的顶级硬件平台

物联网 (IoT) 的顶级硬件平台IoT(物联网)不再是一个流行词。随着每天出现几个鼓舞人心的用例,多家公司现在正在探索如何利用该技术实现业务增长。无论实施何种其他技术,基于物联网的新设备正迅速成为一项重…

TCP传输层协议(4)

TCP应用层协议(4) 流量控制 接收端处理数据的速度是有限的. 如果发送端发的太快, 导致接收端的缓冲区被打满, 这个时候如果发送端继续发送, 就会造成丢包, 继而引起丢包重传等等一系列连锁反应. 因此 TCP 支持根据接收端的处理能力, 来决定发送端的发送速…

双向SSL认证之Apache实战配置

防御未授权访问,为企业级应用构筑双重身份验证防线 本文是关于Apache配置双向SSL认证的深度技术指南,包含全流程操作、调试技巧及企业级解决方案,适用于运维工程师和安全管理员。 1.为什么需要双向认证 ? 核心价值 &#x1f51…