0%

elasticsearch基本操作

Elasticsearch 6.8.x 基本操作全解析

Elasticsearch 提供了丰富的 RESTful API 用于数据的增删改查及集群管理。以下基于 6.8.x 版本(支持 Type),详细介绍核心操作的语法、示例及注意事项。

统计操作:集群文档数量

通过 _count API 统计集群中匹配查询条件的文档总数(默认统计所有文档)。

语法

1
2
3
4
GET _count?pretty
{
"query": { "match_all": {} } // 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": "新标题" // 未指定的字段会丢失
}

局部更新(仅修改指定字段)

使用 _updatedoc 字段,仅更新部分字段,保留其他字段。

1
2
3
4
5
6
POST video/default/1/_update
{
"doc": { // 必须包含在doc中
"duration": 214 // 新增或修改duration字段
}
}

条件更新(按查询更新)

通过 _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", // 脚本逻辑(ctx._source 指代文档)
"lang": "painless", // ES内置脚本语言
"params": { "num": 10 } // 传入参数
}
}
  • 功能:将 duration 字段值增加 10。

查询操作

ES 提供多种查询方式,满足不同场景需求。

基础查询

(1)查询所有文档
1
2
3
4
GET _search  // 查询所有索引,默认返回10条
{
"query": { "match_all": {} } // match_all 匹配所有
}
  • 响应字段说明:
    • took:查询耗时(毫秒);
    • hits.total:匹配的文档总数;
    • hits.hits:匹配的文档列表(含 _source 原始数据)。
(2)按索引 / 类型查询
1
2
3
4
5
6
// 单索引
GET video/default/_search
// 多索引(逗号分隔)
GET video,book/default/_search
// 通配符(匹配前缀为dws的索引)
GET dws*/default/_search
(3)按文档 ID 查询
1
GET video/default/1  // 查询ID=1的文档
  • 响应中_source字段为文档原始数据;若需仅返回_source:

    1
    2
    GET video/default/1/_source  // 仅返回原始数据
    GET video/default/1/_source?_source=keywords,doc_title // 仅返回指定字段
(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" // 需同时匹配"人物"和"老人"(默认or)
}
}
}
}
(3)match_phrase 短语查询

要求分词后的所有词项顺序一致且连续

1
2
3
4
5
6
7
8
GET video/default/_search
{
"query": {
"match_phrase": {
"message": "this is a test" // 需精确匹配"this is a test"短语
}
}
}
(4)term 精确匹配

用于未分词字段(如数字、日期、not_analyzed 字符串),匹配完整词项。

1
2
3
4
5
6
GET video/default/_search
{
"query": {
"term": { "doc_id": "ff22e9ff5d65b198e3967226a7b13a73" } // 精确匹配doc_id
}
}
(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)其他常用查询
  • exists:判断字段是否存在;

    1
    { "query": { "exists": { "field": "tag" } } }  // 返回包含tag字段的文档
  • prefix:前缀匹配;

    1
    { "query": { "prefix": { "user": "ki" } } }  // 匹配user字段以"ki"开头的文档
  • wildcard:通配符匹配(*任意字符,?单个字符);

    1
    { "query": { "wildcard": { "user": "ki*y" } } }  // 匹配"ki"开头、"y"结尾的user
  • fuzzy:模糊匹配(允许拼写错误,如 “ki” 可匹配 “kin”);

    1
    { "query": { "fuzzy": { "user": "ki" } } }

高级功能

(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] // 直接指定ID列表
}
(3)分页查询

通过 from(跳过的条数)和 size(返回的条数)实现分页。

1
2
3
4
5
GET video/default/_search
{
"from": 100, // 跳过前100条
"size": 2 // 返回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" } } // 删除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}} // update的请求体(需包含doc)
{"index": {"_index": "book", "_type": "default"}} // 新增文档(ID自动生成)
{"title": "红楼梦", "price": 78}
  • 注意:最后一行需以 \n 结尾;每个操作独立执行,互不影响。

排序

通过 sort 按指定字段排序(默认按相关性得分排序)。

示例

1
2
3
4
5
6
7
GET video/default/_search
{
"query": { "match_all": {} },
"sort": {
"duration": { "order": "asc" } // 按duration升序(asc);降序为desc
}
}
  • 支持多字段排序:

    1
    2
    3
    4
    "sort": [
    { "duration": { "order": "asc" } },
    { "publishTime": { "order": "desc" } }
    ]

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10