ES的API操作理解
2026年3月15日大约 3 分钟
操作理解
| ES 操作 | HTTP 方法 | 对应 MySQL 操作 | 核心说明 |
|---|---|---|---|
PUT 索引名 | PUT | CREATE TABLE 表名 | 创建索引(表),必须用 PUT |
PUT 索引名/_doc/业务ID | PUT | INSERT/UPDATE 表名 WHERE id=? | 创建/更新指定 ID 的文档(行),幂等操作 |
POST 索引名/_doc | POST | INSERT 表名 | 新增文档(行),ES 自动生成随机 ID |
POST 索引名/_search | POST | SELECT * FROM 表名 WHERE ... | 检索文档(行),只能用 POST,支持复杂条件 |
DELETE 索引名/_doc/业务ID | DELETE | DELETE FROM 表名 WHERE id=? | 删除指定 ID 的文档(行) |
ES 对 HTTP 方法的语义有严格约定
| HTTP 方法 | 核心语义 | 适用场景 |
|---|---|---|
PUT | 幂等性创建 / 更新(多次执行结果一致) | 创建索引、指定 ID 新增 / 更新文档 |
POST | 非幂等性创建(多次执行可能创建多个文档) | 自动生成 ID 新增文档、执行搜索 / 聚合等操作 |
PUT 和 POST 操作文档的区别(关键!)
用「新增文档」举例
# 1. PUT 指定 ID 新增(幂等)
curl -X PUT "http://localhost:9200/youhu_content_v1/_doc/1" -d '{"title":"游鹄生态"}'
# 执行1次:创建 ID=1 的文档
# 执行第2次:覆盖 ID=1 的文档(内容更新,不会新建)
# 2. POST 指定 ID 新增(幂等,和 PUT 一样)
curl -X POST "http://localhost:9200/youhu_content_v1/_doc/1" -d '{"title":"游鹄生态 v2"}'
# 执行1次:创建 ID=1 的文档
# 执行第2次:覆盖 ID=1 的文档
# 3. POST 不指定 ID 新增(非幂等)
curl -X POST "http://localhost:9200/youhu_content_v1/_doc" -d '{"title":"游鹄生态"}'
# 执行1次:创建 ID=随机值 的文档
# 执行第2次:创建 ID=新随机值 的文档(多了一个文档)细节补充
1._doc 是什么?
它是 ES 7.x 以后的「文档类型」(7.x 移除了多类型,统一用 _doc),相当于 MySQL 里的「表」(但 ES 里一个索引就是一个「表」,_doc 只是固定后缀);
格式固定:索引名/_doc/文档ID,不能省略 _doc(省略会报错)。
2._search 是查询,但有两个关键点:
必须用 POST(哪怕是简单查询,也不能用 GET/PUT);
不仅能做「单索引查询」(索引名/_search),还能做「多索引查询」(索引1,索引2/_search)或「所有索引查询」(_search),比 MySQL 的 SELECT 更灵活。
示例理解
- 创建「游鹄内容表」(ES 索引)→ 对应 MySQL CREATE TABLE
# ES(PUT 创建索引)
PUT youhu_content_v1
{
"settings": { "analysis": { "analyzer": { "default": { "type": "ik_max_word" } } } },
"mappings": {
"properties": {
"title": { "type": "text" },
"content": { "type": "text" },
"author_id": { "type": "keyword" }
}
}
}
# 对应 MySQL
CREATE TABLE youhu_content_v1 (
id BIGINT PRIMARY KEY,
title VARCHAR(255),
content TEXT,
author_id VARCHAR(64)
);2.新增 / 更新「内容行」→ 对应 MySQL INSERT/UPDATE
# ES(PUT 指定业务ID,创建/更新)
PUT youhu_content_v1/_doc/1001 # 1001 是业务ID(比如内容ID)
{
"title": "游鹄生态系统架构设计",
"content": "INTJ 架构师的优雅设计",
"author_id": "youhu_001"
}
# 对应 MySQL
INSERT INTO youhu_content_v1 (id, title, content, author_id)
VALUES (1001, '游鹄生态系统架构设计', 'INTJ 架构师的优雅设计', 'youhu_001')
ON DUPLICATE KEY UPDATE title=VALUES(title), content=VALUES(content);- 查询「内容行」→ 对应 MySQL SELECT
# ES(POST _search 查询)
POST youhu_content_v1/_search
{
"query": {
"match": { "content": "架构师 优雅设计" } # 全文检索
},
"from": 0,
"size": 10 # 分页,对应 MySQL LIMIT 0,10
}
# 对应 MySQL(但 MySQL 做不到全文语义检索)
SELECT * FROM youhu_content_v1
WHERE content LIKE '%架构师%' OR content LIKE '%优雅设计%'
LIMIT 0,10;