news 2026/5/26 6:56:02

Elasticsearch应用实战:零基础快速理解CRUD操作

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Elasticsearch应用实战:零基础快速理解CRUD操作

从零上手 Elasticsearch:像写 SQL 一样玩转增删改查

你有没有遇到过这样的场景?老板说:“我们要做一个商品搜索功能,支持按名称、描述、标签模糊匹配,还要能按价格排序。”
你打开 MySQL,写了条LIKE '%手机%'的查询,一测——慢得像蜗牛。日志里全是“查询超时”。

这不是你的问题。传统数据库在处理文本检索这件事上,天生就不擅长。

这时候,Elasticsearch 就该登场了。

它不是替代 MySQL 的“主库”,而是专为快速搜索而生的利器。你可以把它想象成一个超级高效的“倒排字典”:不是你去一条条翻数据,而是它早就把每个词的位置记好了,你要找什么,一秒定位。

但对新手来说,官方文档太厚、概念太多,“索引”“分片”“映射”……还没开始就劝退了。

别慌。今天我们不讲集群部署,也不谈底层原理,就用最直白的方式,带你30分钟掌握 Elasticsearch 最核心的 CRUD 操作——就像你当年学 SQL 那样,先会“增删改查”,再谈别的。


先搞懂几个“人话版”概念

Elasticsearch 看起来复杂,其实骨架很简单。我们用数据库来类比,马上就能理解:

数据库术语Elasticsearch 对应说明
表(Table)索引(Index)比如usersproducts,用来存一类数据
行(Row)文档(Document)一条具体的数据,比如一个用户信息
字段(Column)字段(Field)文档里的 key,比如nameage
主键(Primary Key)_id每个文档的唯一标识

📌 注意:Elasticsearch 存的是 JSON 文档。也就是说,你不需要提前建表、定义字段类型,直接扔 JSON 进去就行,它自己会“猜”字段类型(这叫动态映射)。

举个例子:

{ "name": "张三", "age": 28, "city": "北京" }

这就是一个文档,可以放进users这个索引里。


增:怎么加一条数据?

想往users里加个用户,有两种方式:

方式一:自己指定 ID(用PUT

PUT /users/_doc/1 { "name": "张三", "age": 28, "email": "zhangsan@example.com", "city": "北京" }
  • /users:索引名
  • /_doc:固定写法,表示这是个文档
  • /1:你指定的 ID

✅ 适合需要固定 ID 的场景,比如用户 ID 对应数据库主键。

方式二:让系统自动生成 ID(用POST

POST /users/_doc { "name": "李四", "age": 32, "email": "lisi@example.com", "city": "上海" }
  • 不写 ID,用POST请求
  • ES 会自动生成一串唯一的_id,比如abc123xyz

✅ 适合日志、事件这类不需要人工管理 ID 的数据。

💡 小贴士:如果你用PUT写了一个已存在的 ID,旧数据会被覆盖。这不是报错,而是“upsert”行为(存在则更新,否则创建)。


查:怎么读取一条数据?

有了数据,怎么拿回来?

基础读取:根据 ID 找

GET /users/_doc/1

返回结果长这样:

{ "_index": "users", "_id": "1", "_version": 1, "found": true, "_source": { "name": "张三", "age": 28, "email": "zhangsan@example.com", "city": "北京" } }

关键字段解释:
-_source:就是你存的那个原始 JSON
-_version:版本号,每次修改都会 +1
-found:布尔值,false表示没找到,不会报错

高级一点:只看部分字段

如果只想看名字和城市,减少网络传输:

GET /users/_doc/1?_source_includes=name,city

返回就只剩:

"_source": { "name": "张三", "city": "北京" }

是不是很像 SQL 的SELECT name, city FROM users WHERE id = 1


改:如何更新一条数据?

Elasticsearch 的更新其实是“先删后插”,但对外表现得像“局部更新”。

方法一:替换部分字段(推荐)

POST /users/_update/1 { "doc": { "age": 29, "city": "深圳" } }
  • 只传你想改的字段
  • 其他字段保持不变

方法二:用脚本动态计算(高级用法)

比如给年龄加 1:

POST /users/_update/1 { "script": { "source": "ctx._source.age += 1" } }

这里的ctx._source就是指当前文档。

⚠️ 注意事项:
- 不能改_id_index,这是元数据,动不了。
- 脚本功能强大,但也可能被滥用,生产环境建议限制脚本权限。


删:怎么删除数据?

删除也分两种粒度。

删除单条文档

DELETE /users/_doc/1

返回:

{ "result": "deleted" }

删除整个索引(慎用!)

DELETE /users

这条命令会把users索引连带所有数据、设置一起干掉,不可恢复

🔥 警告:生产环境千万别手抖执行这种命令。建议先备份,或者使用索引别名机制来避免误删。

条件删除?也可以(但要小心)

想删掉所有来自北京的用户?可以用:

POST /users/_delete_by_query { "query": { "term": { "city.keyword": "北京" } } }

但这不是普通操作,它是“扫描全索引+批量删除”,非常耗资源。建议在低峰期执行,并监控集群负载。


实际怎么用?一个真实工作流

假设你在做一个用户中心系统,流程是这样的:

  1. 注册 → Create
    用户注册成功后,后端调 API 把用户信息写入 ES:
    python es.index(index="users", id=user_id, body=user_data)

  2. 登录 → Read
    输入邮箱查用户:
    python es.get(index="users", id=user_id)

  3. 改资料 → Update
    用户换了城市,只更新这个字段:
    python es.update(index="users", id=user_id, body={"doc": {"city": "杭州"}})

  4. 注销账号 → Delete
    删除文档(或改为软删除,打个标记):
    python es.delete(index="users", id=user_id)

整个过程全是 RESTful 接口,无论你是用 Java、Python 还是 Node.js,都有成熟的客户端封装,语法几乎一致。


新手常踩的坑,我帮你避开了

问题正确做法
不知道 PUT 和 POST 有啥区别想指定 ID 用PUT /index/_doc/id,随机 ID 用POST /index/_doc
怕删错数据删除前先GET确认存在;重要数据加备份机制
更新失败不知道为啥检查文档是否存在,不存在时_update可能报错
中文搜索不准后续可以引入 IK 分词器,现在先学会 CRUD

写在最后:CRUD 是起点,不是终点

你可能会问:“我就学这几个接口,够吗?”

够。足够你迈出第一步

就像学编程从Hello World开始,学数据库从INSERT INTO开始一样,CRUD 是你理解 Elasticsearch 的入口。

掌握了这些,你就可以:
- 搭建一个简单的搜索服务
- 把业务数据同步到 ES 供查询
- 在 Kibana 里查看数据、调试请求

下一步自然会想到:
- “怎么搜多个条件?” → 学 Query DSL
- “怎么分页?” → 学from/size
- “怎么高亮关键词?” → 学highlight
- “怎么和 MySQL 同步?” → 学 Logstash 或监听 Binlog

但那些,都是后话了。


现在,打开你的 Kibana Dev Tools 或 Postman,试着敲一遍这四个操作:

# 1. 加一条 POST /users/_doc { "name": "王五", "age": 25 } # 2. 查一下 GET /users/_doc/[刚才返回的_id] # 3. 改年龄 POST /users/_update/[id] { "doc": { "age": 26 } } # 4. 删掉它 DELETE /users/_doc/[id]

当你看到每一步都成功返回,你会突然觉得:原来 Elasticsearch,也没那么难。

从 CRUD 开始,你已经踏进了搜索世界的门

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/25 2:32:51

Python抢票终极指南:大麦网自动化购票完整教程

Python抢票终极指南:大麦网自动化购票完整教程 【免费下载链接】DamaiHelper 大麦网演唱会演出抢票脚本。 项目地址: https://gitcode.com/gh_mirrors/dama/DamaiHelper 面对热门演唱会一票难求的困境,Python技术为抢票难题提供了智能化解决方案。…

作者头像 李华
网站建设 2026/5/26 4:08:42

NCM音频格式转换技术深度解析

在数字音乐存储格式多样化的背景下,网易云音乐采用的NCM格式为用户带来了特定的播放场景限制。本文将深入探讨如何通过专业工具实现音频格式的灵活转换。 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 技术原理与实现机…

作者头像 李华
网站建设 2026/5/25 20:21:32

付费墙终结者:5大免费阅读神器全面解析

付费墙终结者:5大免费阅读神器全面解析 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 当你满怀期待地点开一篇深度报道,却被冰冷的付费墙无情拦截&#xff0c…

作者头像 李华
网站建设 2026/5/25 7:21:11

3步精通位置模拟功能:新手零失败实战指南

想要轻松实现Android设备的位置模拟功能?位置模拟工具能够帮助你在各类应用中实现位置信息展示。本文将为你提供一套简单易行的操作方案,确保位置功能稳定运行。 【免费下载链接】MockGPS Android application to fake GPS 项目地址: https://gitcode.…

作者头像 李华
网站建设 2026/5/24 21:24:04

联想笔记本性能优化工具终极指南:完整系统调优解决方案

联想笔记本性能优化工具终极指南:完整系统调优解决方案 【免费下载链接】LenovoLegionToolkit Lightweight Lenovo Vantage and Hotkeys replacement for Lenovo Legion laptops. 项目地址: https://gitcode.com/gh_mirrors/le/LenovoLegionToolkit 还在为联…

作者头像 李华