写点什么

大数据 -173 Elasticsearch 映射与文档增删改查实战(基于 7.x/8.x)JSON

作者:武子康
  • 2025-12-05
    山东
  • 本文字数:3499 字

    阅读完需:约 11 分钟

大数据-173 Elasticsearch 映射与文档增删改查实战(基于 7.x/8.x)JSON

TL;DR

  • 场景:从零搭建 Elasticsearch 索引,需要搞清楚映射配置和文档增删改查的完整流程。

  • 结论:围绕 mapping、_doc、新增/查询/更新/删除 全链路串起来,并给出常见坑位与推荐写法。

  • 产出:一套可复制的索引 + 映射 + 文档 CRUD 示例,附常见错误速查表与版本适配说明。


版本矩阵


映射操作

索引创建之后,等于有了关系型数据库中的 Database,Elasticsearch7.x 取消了索引 type 类型的设置,不允许指定类型,默认为_doc,但字段仍然是有的,我们需要设置字段的约束信息,叫做字段映射(mapping)字段的约束包括但不限于:


  • 字段的数据类型

  • 是否要存储

  • 是否要索引

  • 分词器

创建映射字段

语法:


PUT /索引名/_mapping{  "properties": {    "字段名": {      "type": "数据类型",      "index": true,      "store": false,      "analyzer": "分词器"    }  }}
复制代码


上述内容解释如下:


  • type 类型,可以是 text、long、short、date 等等

  • index 是否为索引 默认为 true

  • store 是否存储 默认为 false

  • analyzer 分词器


示例:


# 新建索引PUT /wzkicu-index# 映射关系PUT /wzkicu-index/_mapping/{  "properties": {    "name": {      "type": "text",      "analyzer": "ik_max_word"    },    "job": {      "type": "text",      "analyzer": "ik_max_word"    },    "logo": {      "type": "keyword",      "index": "false"    },    "payment": {      "type": "float"    }  }}
复制代码


运行结果如下图所示:



上图中,包含的字段如下所示,并且加了一些属性:


  • name 企业名称

  • job 需求岗位

  • logo logo 图片地址

  • payment 薪资

映射属性详解

支持的类型非常的多,可以访问对应的文档进行查看:


https://www.elastic.co/guide/en/elasticsearch/reference/8.15/mapping-types.html
复制代码


对应的页面如下图所示:



这里有几种:


  • String 类型:text 可分词,不可参与聚合。keyword 不可分词,作为完整字段进行分配,可以参与聚合。

  • Numerical 类型:数值类型、分两类,基本数据类型、浮点数的高精度类型

  • Date:日期类型,ES 可以对日期格式化字符串存储,但是建议我们存储为毫秒值、存储为 long、节省空间。

  • Array 数组类型,进行匹配时,任意一个元素满足,都认为满足。排序时,如果升序则用数组中最小值来排序,如果降序则用数组中的最大值来排序

  • Object 对象,{ name: "jack", age: 21, girl: {name: "Rose", age: 21}},如果存储到索引库是对象类型,例如上面的 girl,会把 girl 变成 girl.name 和 girl.age

  • index,true 字段会被索引,则可以用来进行搜索,默认值就是 true。false 字段不会被索引,不能用来搜索。比如 LOGO 的图片地址,这种不需要索引,就可以设置为 False。

  • store,是否将数据进行独立存储,原始的文本存储在 _source 里面,默认情况下其他提取出来的字段都不是独立存储的,是从_source 里面提取出来的。当然你也可以独立的存储某个字段,只要设置 store:true 即可,获取独立存储的字段要比_source 中解析快得多,但是也会占用更多的空间,所以要根据实际业务需要来设置,默认为 false

  • analyzer:指定分词器 一般使用 IK 分词器 ik_max_word ik_smart

查看映射关系

单个映射关系语法:


GET /索引名称/_mapping
复制代码


示例:


GET /wzkicu-index/_mapping
复制代码


执行的结果如下图所示:


所有映射关系

语法:


GET _mappingGET _all/_mapping
复制代码


执行结果如下图所示:


修改映射关系

PUT /索引库名/_mapping{  "properties": {    "字段名": {      "type": "类型",      "index": true,      "store": true,      "analyzer": "分词器"    }  }}
复制代码


主要注意的是:修改映射只能是增加字段的操作,其他的更改只能删除索引重新建立索引来实现。

一次性建立索引与映射

实际上创建索引和映射是可以放到一起来做的, 在创建索引的同时,直接指定映射。


PUT /索引库名称{  "settings":{    "索引库属性名":"索引库属性值"  },  "mappings":{    "properties":{      "字段名":{        "映射属性名":"映射属性值"      }    }  }}
复制代码


案例:


PUT /wzk-index{  "settings": {},  "mappings": {    "properties": {      "name": {        "type": "text",        "analyzer": "ik_max_word"      }    }  }}
复制代码


执行结果如下图所示:


文档增删改查与局部更新

文档,即索引库中的数据,会根据规则创建索引,将用来搜索,可以类比做数据库中的一行数据。

新增文档

新增文档时,涉及到的 ID 的创建方式,手动指定或者自动生成。

手动新增

POST /索引名称/_doc/{id}
复制代码


示例:


POST /wzkicu-index/_doc/1{"name" : "百度",  "job" : "小度用户运营经理",  "payment" : "30000",  "logo" : "https://profile-avatar.csdnimg.cn/755ff10be62f4e7081bc36028fa9eafe_w776341482.jpg!1"}
POST /wzkicu-index/_doc/2{"name" : "百度", "job" : " 百度用户运营经理", "payment" : "50000", "logo" : "https://profile-avatar.csdnimg.cn/755ff10be62f4e7081bc36028fa9eafe_w776341482.jpg!1"}
复制代码


执行的结果如下图所示:


自动新增

语法:


POST /索引名称/_doc{  "field": "value"}
复制代码


示例:


POST /wzkicu-index/_doc{  "name" : "百度",  "job" : " 百度测试",  "payment" : "20000",  "logo" : "https://profile-avatar.csdnimg.cn/755ff10be62f4e7081bc36028fa9eafe_w776341482.jpg!1"}
复制代码


执行结果如下图所示:


查询文档

单个文档

语法:


GET /索引名称/_doc/{id}
复制代码


示例:


GET /wzkicu-index/_doc/1
复制代码


执行结果如下图所示:



对返回的结果的格式解释如下:


所有文档

语法:


 POST /索引名称/_search
复制代码


示例:


POST /wzkicu-index/_search{  "query":{    "match_all": {    }  }}
复制代码


测试运行的结果如下图所示:


定制返回字段

很多业务场景下,我们不需要返回这么多字段:示例:


GET /wzkicu-index/_doc/1?_source=name,job
复制代码


执行结果如下图所示,可以看到根据需要,只返回了 name 和 job:


更新文档

全部更新

新增方式相同,只不过新增是 POST,而更新是 PUT,而且修改必须指定 ID 才可以。


  • id 对应的文档存在,则修改

  • id 对应的文档不存在,则新增


PUT /wzkicu-index/_doc/5{  "name" : "百度",  "job" : " 百度测试",  "payment" : "20000",  "logo" : "https://profile-avatar.csdnimg.cn/755ff10be62f4e7081bc36028fa9eafe_w776341482.jpg!1"}
复制代码


第一次执行,可以看到右侧是:created:



再执行一次,可以看到右侧是:updated:


局部更新

ES 可以使用 PUT 或者 POST 进行更新,如果指定 ID 存在,则执行更新操作。注意:


  • ES 执行更新操作的时候,ES 是先将旧的标记为删除,再添加新的文档。

  • 旧的文档不会立即消失,但是你也无法访问,ES 会在添加更多数据的时候,后台清理已经标记为删除的数据。全部更新是直接把之前的老数据,标记为删除状态,然后再添加一条更新的数据(PUT 或者 POST),局部更新,只是修改某个字段(POST)。


POST /索引名/_update/{id}{  "doc":{    "field":"value"  }}
复制代码


示例:


POST /wzkicu-index/_update/2{  "doc":{    "name":"淘宝"  }}
复制代码


执行的结果如下图所示:


删除文档

ID 删除语法:


DELETE /索引名/_doc/{id}
复制代码


示例


DELETE /wzkicu-index/_doc/3
复制代码


执行结果如下图所示:


条件删除

语法:


POST /索引名/_delete_by_query{  "query": {    "match": {      "字段名": "搜索关键字"    }  }}
复制代码


示例:


# 查询一下 包含百度关键字的POST /wzkicu-index/_search{  "query":{    "match":{      "name":"百度"    }  }}
# 删除name字段为百度的docPOST /wzkicu-index/_delete_by_query{ "query":{ "match":{ "name":"百度" } }}
复制代码


执行结果如下图所示:


删除所有

POST /索引名/_delete_by_query{  "query": {    "match_all": {}  }}
复制代码

错误速查

其他系列

🚀 AI 篇持续更新中(长期更新)

AI 炼丹日志-29 - 字节跳动 DeerFlow 深度研究框斜体样式架 私有部署 测试上手 架构研究,持续打造实用 AI 工具指南!AI 研究-132 Java 生态前沿 2025:Spring、Quarkus、GraalVM、CRaC 与云原生落地🔗 AI模块直达链接

💻 Java 篇持续更新中(长期更新)

Java-180 Java 接入 FastDFS:自编译客户端与 Maven/Spring Boot 实战 MyBatis 已完结,Spring 已完结,Nginx 已完结,Tomcat 已完结,分布式服务已完结,Dubbo 已完结,MySQL 已完结,MongoDB 已完结,Neo4j 已完结,FastDFS 已完结,OSS 正在更新... 深入浅出助你打牢基础!🔗 Java模块直达链接

📊 大数据板块已完成多项干货更新(300 篇):

包括 Hadoop、Hive、Kafka、Flink、ClickHouse、Elasticsearch 等二十余项核心组件,覆盖离线+实时数仓全栈!大数据-278 Spark MLib - 基础介绍 机器学习算法 梯度提升树 GBDT 案例 详解🔗 大数据模块直达链接

发布于: 刚刚阅读数: 5
用户头像

武子康

关注

永远好奇 无限进步 2019-04-14 加入

Hi, I'm Zikang,好奇心驱动的探索者 | INTJ / INFJ 我热爱探索一切值得深究的事物。对技术、成长、效率、认知、人生有着持续的好奇心和行动力。 坚信「飞轮效应」,相信每一次微小的积累,终将带来深远的改变。

评论

发布
暂无评论
大数据-173 Elasticsearch 映射与文档增删改查实战(基于 7.x/8.x)JSON_nosql_武子康_InfoQ写作社区