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" } } ]
|