一文吃透Elasticsearch基础操作:索引+文档+聚合,全都有例子_elasticsearch 创建索引
Elasticsearch入门必备:最常用的索引与文档操作命令大全
-
- 1. 索引管理命令
-
- 1.1. 创建索引
-
- 1.1.1. 基本创建
- 1.1.2. 带别名创建
- 1.2. 删除索引
-
- 1.2.1. 删除单个索引
- 1.2.2. 批量删除索引
- 1.3. 查看索引信息
-
- 1.3.1. 查看索引
- 1.3.2. 查看索引映射
- 1.3.3. 查看所有索引
- 1.4. 修改索引信息
-
- 1.4.1. 创建新索引定义新映射
- 1.4.2. 迁移数据
- 1.4.3. 切换别名
- 1.5. 已有索引添加新映射
- 2. 别名管理命令
-
- 2.1. 索引添加别名
-
- 2.1.1. 在创建索引时直接设置别名
- 2.1.2. 为已存在的索引添加别名
- 2.2. 索引删除别名
- 2.3. 查看别名对应的索引
- 3. 文档操作命令
-
- 3.1. 新增文档
- 3.2. 修改文档数据
- 3.3. 删除文档数据
- 3.4. 数据查询
-
- 3.4.1. 范围查询
- 3.4.2. 前缀查询
- 3.4.3. 模糊查询
- 3.4.4. 混合模糊查询
- 3.5. 聚合查询
-
- 3.5.1. 统计总数
- 3.5.2. 分组统计总数
- 3.5.3. 统计总平均数
- 3.5.4. 统计最大数
- 3.5.5. 统计最小数
- 3.5.6. 综合统计信息
- 3.5.7. 分组综合统计
- 3.6. 分页查询
-
- 3.6.1. From/Size 分页(基础分页)
-
- 特点
- 适用场景
- 3.6.2. Search After 游标分页(深度分页推荐方案)
-
- 特点
- 适用场景
- 3.6.3. 聚合查询分页
-
- 不分页的聚合查询为
- 分页的聚合查询为
Elasticsearch常用的索引、文档基础操作操作语句,例如创建索引、删除索引、修改索引设置、修改索引mapping字段结构、新增文档、删除文档、查询文档、聚合统计等常用操作。
1. 索引管理命令
1.1. 创建索引
1.1.1. 基本创建
PUT /your_index_name{ \"settings\": { \"number_of_shards\": 3, \"number_of_replicas\": 1 }, \"mappings\": { \"properties\": { \"title\": {\"type\": \"text\"}, \"createTime\": {\"type\": \"date\"} } }}
1.1.2. 带别名创建
PUT /your_index_name_2025{\"aliases\": { \"your_index_name\": {} } \"settings\": { \"number_of_shards\": 3, \"number_of_replicas\": 1 }, \"mappings\": { \"properties\": { \"title\": {\"type\": \"text\"}, \"createTime\": {\"type\": \"date\"} } }}
1.2. 删除索引
1.2.1. 删除单个索引
DELETE /your_index_name
1.2.2. 批量删除索引
DELETE /your_index_name_*
1.3. 查看索引信息
1.3.1. 查看索引
GET /your_index_name/_settings
1.3.2. 查看索引映射
GET /your_index_name/_mapping
1.3.3. 查看所有索引
GET /_cat/indices?v
1.4. 修改索引信息
ES不允许直接修改已存在字段的映射类型,可以用如下方法进行处理
1.4.1. 创建新索引定义新映射
PUT /new_index_name{ \"mappings\": { \"properties\": { \"balance\": { \"type\": \"double\" // 修改为新的类型 }, // 其他字段保持不变... } }}
1.4.2. 迁移数据
POST /_reindex{ \"source\": { \"index\": \"old_index_name\"// 旧索引名称 }, \"dest\": { \"index\": \"new_index_name\"// 新索引名称 }}
1.4.3. 切换别名
如果旧索引没有使用别名,则用如下操作
// 需要先删除旧索引DELETE /old_index_name// 给新索引加上别名,别名为旧索引的名称POST /_aliases{ \"actions\": [ { \"add\": { \"index\": \"new_index_name\", \"alias\": \"old_index_name\" } } ]}
如果旧索引有使用别名,则用如下操作
POST /_aliases{ \"actions\": [ { \"remove\": {// 移除旧索引的别名index_alias_name \"index\": \"old_index_name\", \"alias\": \"index_alias_name\" } }, { \"add\": { // 给新索引加上别名index_alias_name \"index\": \"new_index_name\", \"alias\": \"index_alias_name\" } } ]}
1.5. 已有索引添加新映射
PUT /your_index_name/_mapping{ \"properties\": { \"newField\": {// 新字段映射 \"type\": \"text\" } }}
2. 别名管理命令
2.1. 索引添加别名
2.1.1. 在创建索引时直接设置别名
PUT /your_index_name{ \"aliases\": { \"your_index_alias_name索引别名\": {} }, \"settings\": { // 您现有的settings配置 ... }, \"mappings\": { // 您现有的mappings配置 ... }}
2.1.2. 为已存在的索引添加别名
POST /_aliases{ \"actions\": [ { \"add\": { \"index\": \"your_index_name\", \"alias\": \"your_index_alias_name\" } } ]}
2.2. 索引删除别名
DELETE /index_name/_alias/alias_name
2.3. 查看别名对应的索引
GET /_alias/your_alias_name
3. 文档操作命令
3.1. 新增文档
POST /your_index_name/_doc/1000003{ \"id\": \"1000003\", \"className\": \"16级XXX二班\", \"submitTime\": \"2024-05-05 12:04:11\", \"state\": 1, \"unitProvince\": \"420000000000\", \"unitCity\": \"429000000000\", \"unitArea\": \"429004000000\"}
3.2. 修改文档数据
POST /your_index_name/_update/1000003{ \"doc\": { \"submitTime\": \"2025-04-01 21:15:05\" }}
3.3. 删除文档数据
DELETE /your_index_name/_doc/1000003
3.4. 数据查询
3.4.1. 范围查询
# 范围查询POST data_index_name/_search{ \"query\": { \"bool\": { \"filter\": [ { \"range\": { \"createTime\": { \"gte\": \"2025-01-01 00:00:00\", \"lte\": \"2025-02-10 23:59:59\" } } } ] } }}
3.4.2. 前缀查询
# 前缀查询(带字母)POST data_index_name/_search{ \"query\": { \"prefix\": { \"fieldName.keyword\": \"CODE250506\" } }}
类似于SQL里的右模糊查询
select * from data_index_name where fieldName like \'CODE250506%\';
3.4.3. 模糊查询
# 模糊查询POST data_index_name/_search{ \"query\": { \"wildcard\": { \"fieldName.keyword\": \"*CODE250506*\" } }}
类似于SQL里的全模糊查询
select * from data_index_name where fieldName like \'%CODE250506%\';
3.4.4. 混合模糊查询
POST data_index_name/_search{ \"query\": { \"query_string\": { \"default_field\": \"fieldName\", \"query\": \"CODE*0506* OR CODE0506*\" } }}
类似于SQL里的组合模糊查询
select * from data_index_name where fieldName like \'CODE%0506%\' or fieldName like \'CODE0506%\';
3.5. 聚合查询
3.5.1. 统计总数
类比
select count(*) from table;
查询示例
POST /your_index_name/_search{ \"size\": 0, \"aggs\": { \"total_count\": { \"value_count\": { \"field\": \"id\" } } }}
结果示例
{ \"took\" : 0, \"timed_out\" : false, \"_shards\" : { \"total\" : 2, \"successful\" : 2, \"skipped\" : 0, \"failed\" : 0 }, \"hits\" : { \"total\" : { \"value\" : 113, \"relation\" : \"eq\" }, \"max_score\" : null, \"hits\" : [ ] }, \"aggregations\" : { \"total_count\" : { \"value\" : 113// 统计结果 } }}
3.5.2. 分组统计总数
类比
select unit_id, count(*) from table group by unit_id;
查询示例
POST /your_index_name/_search{ \"size\": 0, \"aggs\": { \"by_unitId\": { \"terms\": { \"field\": \"unitId\", \"size\": 1 } } }}
结果示例
{ \"took\" : 1, \"timed_out\" : false, \"_shards\" : { \"total\" : 2, \"successful\" : 2, \"skipped\" : 0, \"failed\" : 0 }, \"hits\" : { \"total\" : { \"value\" : 113, \"relation\" : \"eq\" }, \"max_score\" : null, \"hits\" : [ ] }, \"aggregations\" : { \"by_unitId\" : { \"doc_count_error_upper_bound\" : 0, \"sum_other_doc_count\" : 60, \"buckets\" : [ { \"key\" : \"96d428ff45644c9dae5dc08313467d86\", \"doc_count\" : 53// 单位Id为96d428ff45644c9dae5dc08313467d86的文档数据量结果 } ] } }}
3.5.3. 统计总平均数
类比
select avg(planVolume) from table;
查询示例
POST /your_index_name/_search{ \"size\": 0, \"aggs\": { \"avg_planVolume\": { \"avg\": { \"field\": \"planVolume\" } } }}
结果示例
{ \"took\" : 1, \"timed_out\" : false, \"_shards\" : { \"total\" : 2, \"successful\" : 2, \"skipped\" : 0, \"failed\" : 0 }, \"hits\" : { \"total\" : { \"value\" : 113, \"relation\" : \"eq\" }, \"max_score\" : null, \"hits\" : [ ] }, \"aggregations\" : { \"avg_planVolume\" : { \"value\" : 1318.9097345132743// 平均数统计结果 } }}
3.5.4. 统计最大数
类比
select max(planVolume) from table;
查询示例
POST /your_index_name/_search{ \"size\": 0, \"aggs\": { \"max_planVolume\": { \"max\": { \"field\": \"planVolume\" } } }}
结果示例
{ \"took\" : 1, \"timed_out\" : false, \"_shards\" : { \"total\" : 2, \"successful\" : 2, \"skipped\" : 0, \"failed\" : 0 }, \"hits\" : { \"total\" : { \"value\" : 113, \"relation\" : \"eq\" }, \"max_score\" : null, \"hits\" : [ ] }, \"aggregations\" : { \"max_planVolume\" : { \"value\" : 50000.0// 最大数统计结果 } }}
3.5.5. 统计最小数
类比
select min(planVolume) from table;
查询示例
POST /your_index_name/_search{ \"size\": 0, \"aggs\": { \"min_planVolume\": { \"min\": { \"field\": \"planVolume\" } } }}
结果示例
{ \"took\" : 1, \"timed_out\" : false, \"_shards\" : { \"total\" : 2, \"successful\" : 2, \"skipped\" : 0, \"failed\" : 0 }, \"hits\" : { \"total\" : { \"value\" : 113, \"relation\" : \"eq\" }, \"max_score\" : null, \"hits\" : [ ] }, \"aggregations\" : { \"min_planVolume\" : { \"value\" : 1.0// 最小数统计结果 } }}
3.5.6. 综合统计信息
类比
select count(*), max(planVolume), min(planVolume), avg(planVolume), sum(planVolume) from table
查询示例
POST /your_index_name/_search{ \"size\": 0, \"aggs\": { \"stats_planVolume\": { \"stats\": { \"field\": \"planVolume\" } } }}
结果示例
{ \"took\" : 1, \"timed_out\" : false, \"_shards\" : { \"total\" : 2, \"successful\" : 2, \"skipped\" : 0, \"failed\" : 0 }, \"hits\" : { \"total\" : { \"value\" : 113, \"relation\" : \"eq\" }, \"max_score\" : null, \"hits\" : [ ] }, \"aggregations\" : { \"stats_planVolume\" : {// 综合统计结果 \"count\" : 113,// 总文档数 \"min\" : 1.0,// 最小数 \"max\" : 50000.0,// 最大数 \"avg\" : 1318.91,// 平均数 \"sum\" : 149036.8// 总和 } }}
3.5.7. 分组综合统计
查询示例
GET /your_index_name/_search{ \"size\": 0, // 不返回原始文档,只返回聚合结果 \"query\": { \"bool\": { \"filter\": [ { \"term\": { // state的精确匹配过滤 \"state\": 1 // 过滤条件,替换为需要的state值 } } // 可以添加其他过滤条件 ] } }, \"aggs\": { \"group_by_unit\": { \"terms\": { \"field\": \"unitId\", // 按指定的字段进行分组 \"size\": 100 // 返回的分组数量,根据需要调整 \"order\": { \"total_volume\": \"desc\"// 按照每个unitId计算planVolume总和进行降序排序 } }, \"aggs\": { \"total_volume\": { \"sum\": { // 计算planVolume总和 \"field\": \"planVolume\" } }, \"data_doc_count\": { \"value_count\": { // 统计根据unitId进行分组后,每组unitId的文档数据量 \"field\": \"id\" } }, \"volume_stats\": { \"stats\": { // 附加统计信息(可选),会返回unitId组里的文档数量、planVolume的最大值、最小值、平均值、总和 \"field\": \"planVolume\" } } } }, \"global_volume\": { // 全局总和(可选),会统计所有unitId组的planVolume之和 \"sum\": { \"field\": \"planVolume\" } } }}
结果示例
{ \"aggregations\": { \"group_by_unit\": { \"buckets\": [ { \"key\": \"100001\", // unitId值 \"doc_count\": 123, // 该unitId下的文档数量 \"total_volume\": { \"value\": 4567.89 // planVolume总和 }, \"data_doc_count\": { \"value\": 123// 该unitId下的文档数量 } \"volume_stats\": { // 附加统计信息 \"count\": 123, \"min\": 10.5, \"max\": 50.2, \"avg\": 37.13, \"sum\": 4567.89 } }, // 其他unitId分组... ] }, \"global_volume\": { \"value\": 12345.67 // 所有匹配文档的总和 } }}
3.6. 分页查询
3.6.1. From/Size 分页(基础分页)
GET /your_index/_search{ \"query\": { \"match_all\": {} }, \"from\": 0, // 起始位置 \"size\": 10 // 每页大小}
特点
- 优点 :简单易用,适合小数据量分页
- 缺点 :深度分页性能差(如
from=10000
) - 限制 :
from + size
不能超过index.max_result_window
(默认 10000)
适用场景
- 前几页的简单分页
- 数据量小于 10,000 条的场景
3.6.2. Search After 游标分页(深度分页推荐方案)
# 第一次查询(需要指定排序)GET /your_index/_search{ \"query\": { \"match_all\": {} }, \"size\": 10, \"sort\": [ {\"timestamp\": \"desc\"}, {\"_id\": \"asc\"} // 必须包含唯一性字段,确保排序唯一 ]}# 后续查询(使用上次最后一条的sort值)GET /your_index/_search{ \"query\": { \"match_all\": {} }, \"size\": 10, \"search_after\": [ // 使用上次结果的sort值 \"2023-05-20 12:00:00\", \"doc123\" ], \"sort\": [ {\"timestamp\": \"desc\"}, {\"_id\": \"asc\"} ]}
特点
- 优点 :适合深度分页,性能稳定
- 缺点 :必须指定稳定排序,不能随机跳页
- 无限制 :不受
max_result_window
限制
适用场景
- 大数据量的深度分页(如导出所有数据)
- 无限滚动(Infinite Scroll)类应用
3.6.3. 聚合查询分页
不分页的聚合查询为
POST /your_index_name/_search{ \"size\": 0, \"aggs\": { \"by_unitId\": { \"terms\": { \"field\": \"unitId\", \"size\": 10 } } }}
分页的聚合查询为
第一页查询
POST /your_index_name/_search{ \"size\": 0, \"aggs\": { \"by_unitId\": { \"terms\": { \"field\": \"unitId\", \"size\": 10, \"order\": { \"_key\": \"asc\" // 或 \"_count\": \"desc\" 按数量排序 } } } }}
注意:如果你要分页,建议显式设置
\"order\"
,否则默认是按_count
降序。为了稳定分页,推荐使用_key
排序。
第二页查询
如果第一页最后一条bucket数据的key是“1000001”(也就是第一页最后一条数据的unitId),则第二页请求语句如下
POST /your_index_name/_search{ \"size\": 0, \"aggs\": { \"by_unitId\": { \"terms\": { \"field\": \"unitId\", \"size\": 10, \"order\": { \"_key\": \"asc\" }, \"include\": { \"after\": { \"term\": \"1000001\" } } } } }}
include.after.term必须是上一页最后一条bucket数据的key。