Elasticsearch 6.8.x 基本操作全解析
Elasticsearch 提供了丰富的 RESTful API 用于数据的增删改查及集群管理。以下基于 6.8.x 版本(支持 Type),详细介绍核心操作的语法、示例及注意事项。
统计操作:集群文档数量
通过 _count
API 统计集群中匹配查询条件的文档总数(默认统计所有文档)。
语法
1 2 3 4
| GET _count?pretty { "query": { "match_all": {} } }
|
响应示例
1 2 3 4 5 6 7 8 9
| { "count": 5091327, "_shards": { "total": 10, "successful": 10, "skipped": 0, "failed": 0 } }
|
添加数据
通过 PUT
请求向指定索引、类型添加文档,支持自动创建索引(根据字段推断映射)。
基本添加(自动创建索引)
1 2 3 4 5 6 7 8
| PUT video/default/1 // video:索引名;default:类型名;1:文档ID { "keywords": "探索 战争 红色", "doc_title": "保卫战", "doc_id": "ff22e9ff5d65b198e3967226a7b13a73", "number": 25, "age": ["0-8", "9-18", "18-40", "40-60"] }
|
- 若文档已存在,此操作会覆盖原文档,并使
_version
版本号 +1。
强制新增(避免覆盖)
使用 _create
确保操作仅在文档不存在时成功,存在则返回 409 错误。
1 2 3 4
| PUT video/default/4/_create // 新增文档ID=4 { "keywords": "历史 纪录片" }
|
- 成功响应码:201(Created);失败响应码:409(Conflict)。
版本控制更新
仅当文档当前版本与指定版本一致时才更新,确保并发安全。
1 2 3 4
| PUT video/default/1?version=2 // 仅版本为2时更新 { "keywords": "探索 战争 红色 历史" }
|
更新数据
支持全量更新、局部更新、条件更新及脚本更新。
全量更新(覆盖文档)
1 2 3 4 5
| POST video/default/1 // 与PUT效果类似,覆盖整个文档 { "keywords": "新关键词", "doc_title": "新标题" }
|
局部更新(仅修改指定字段)
使用 _update
及 doc
字段,仅更新部分字段,保留其他字段。
1 2 3 4 5 6
| POST video/default/1/_update { "doc": { "duration": 214 } }
|
条件更新(按查询更新)
通过 _update_by_query
批量更新满足查询条件的文档。
1 2 3 4 5
| POST video/default/_update_by_query { "doc": { "duration": 214 }, "query": { "term": { "title": "java" } } }
|
脚本更新(复杂逻辑更新)
使用 Painless 脚本执行复杂更新(如字段自增)。
1 2 3 4 5 6 7 8
| POST video/default/1/_update { "script": { "inline": "ctx._source.duration += params.num", "lang": "painless", "params": { "num": 10 } } }
|
查询操作
ES 提供多种查询方式,满足不同场景需求。
基础查询
(1)查询所有文档
1 2 3 4
| GET _search // 查询所有索引,默认返回10条 { "query": { "match_all": {} } }
|
- 响应字段说明:
took
:查询耗时(毫秒);
hits.total
:匹配的文档总数;
hits.hits
:匹配的文档列表(含 _source
原始数据)。
(2)按索引 / 类型查询
1 2 3 4 5 6
| GET video/default/_search
GET video,book/default/_search
GET dws*/default/_search
|
(3)按文档 ID 查询
1
| GET video/default/1 // 查询ID=1的文档
|
(4)检查文档是否存在
1
| HEAD video/default/1 // 仅返回响应码
|
- 存在:200(OK);不存在:404(Not Found)。
高级查询
(1)query_string
查询(支持 Lucene 语法)
支持布尔运算(AND/OR)、范围查询等,默认搜索所有字段(_all
)。
1 2 3 4 5 6 7 8
| GET video/default/_search { "query": { "query_string": { "query": "publishTime:[2018 TO 2022] AND (keywords:人物 OR location:内地)" } } }
|
(2)match
查询(全文检索)
对查询文本分词,默认匹配任何分词结果(operator: or
)。
1 2 3 4 5 6 7 8 9 10 11
| GET video/default/_search { "query": { "match": { "keywords": { "query": "人物 老人", "operator": "and" } } } }
|
(3)match_phrase
短语查询
要求分词后的所有词项顺序一致且连续。
1 2 3 4 5 6 7 8
| GET video/default/_search { "query": { "match_phrase": { "message": "this is a test" } } }
|
(4)term
精确匹配
用于未分词字段(如数字、日期、not_analyzed
字符串),匹配完整词项。
1 2 3 4 5 6
| GET video/default/_search { "query": { "term": { "doc_id": "ff22e9ff5d65b198e3967226a7b13a73" } } }
|
(5)range
范围查询
用于数字、日期等字段的范围匹配。
1 2 3 4 5 6 7 8 9 10 11
| GET video/default/_search { "query": { "range": { "age": { "gte": 20, "lte": 40 } } } }
|
(6)其他常用查询
高级功能
(1)高亮显示
在匹配的词项外添加标签(如 <em>
),便于前端展示。
1 2 3 4 5 6 7 8 9 10 11 12
| GET video/default/_search { "query": { "match_phrase": { "keywords": "战争" } }, "highlight": { "fields": { "keywords": { "pre_tags": ["<red>"], "post_tags": ["</red>"] } } } }
|
(2)多文档查询(_mget
)
批量查询多个文档(支持跨索引)。
1 2 3 4 5 6 7 8 9 10 11 12 13
| GET _mget // 跨索引查询 { "docs": [ { "_index": "video", "_type": "default", "_id": 1 }, { "_index": "book", "_type": "default", "_id": 2 } ] }
GET video/default/_mget { "ids": [1, 2] }
|
(3)分页查询
通过 from
(跳过的条数)和 size
(返回的条数)实现分页。
1 2 3 4 5
| GET video/default/_search { "from": 100, "size": 2 }
|
删除操作
删除索引
1
| DELETE video // 删除整个video索引(不可逆,谨慎操作)
|
删除文档
1
| DELETE video/default/4 // 删除ID=4的文档
|
条件删除(按查询删除)
1 2 3 4
| POST video/_delete_by_query { "query": { "term": { "title": "python" } } }
|
批量操作(_bulk
)
通过单一请求实现多文档的增删改,格式为 每行 JSON + 换行符(\n
)。
语法格式
1 2
| { "action": { "元数据" } }\n { "请求体" }\n // delete操作无请求体
|
action
支持:create
(新增)、index
(新增 / 覆盖)、update
(更新)、delete
(删除)。
示例
1 2 3 4 5 6 7 8
| POST _bulk {"create": {"_index": "book", "_type": "default", "_id": 12}} {"title": "三国演义", "price": 32} {"delete": {"_index": "video", "_type": "default", "_id": 3}} {"update": {"_index": "video", "_type": "default", "_id": 2}} {"doc": {"duration": 1429}} {"index": {"_index": "book", "_type": "default"}} {"title": "红楼梦", "price": 78}
|
- 注意:最后一行需以
\n
结尾;每个操作独立执行,互不影响。
排序
通过 sort
按指定字段排序(默认按相关性得分排序)。
示例
1 2 3 4 5 6 7
| GET video/default/_search { "query": { "match_all": {} }, "sort": { "duration": { "order": "asc" } } }
|
支持多字段排序:
1 2 3 4
| "sort": [ { "duration": { "order": "asc" } }, { "publishTime": { "order": "desc" } } ]
|
v1.3.10