> 技术文档 > 一文吃透Elasticsearch基础操作:索引+文档+聚合,全都有例子_elasticsearch 创建索引

一文吃透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。