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