elasticsearch索引

Elasticsearch 索引管理详解:创建、配置与维护

索引是 Elasticsearch 中存储和检索数据的基本单元,类似于关系数据库中的 “表”。合理的索引管理(创建、配置、维护)直接影响查询性能和数据可靠性。以下基于 6.8.x 版本,详细介绍索引的核心操作。

索引的创建与基础操作

新建索引

使用 PUT 请求创建空索引,默认配置为 5 个主分片和 1 个副本分片。

PUT blog  // 创建名为blog的索引

响应示例(成功):

{
  "acknowledged": true,  // 索引创建成功
  "shards_acknowledged": true  // 分片分配成功
}

查看索引

  • 查看单个索引:

    GET blog  // 返回索引的设置、映射等信息
  • 查看多个索引(逗号分隔):

    GET blog,video  // 同时查看blog和video索引
  • 查看所有索引:

    GET _all  // 或使用通配符 GET *

删除索引

DELETE blog  // 永久删除索引,谨慎操作

注意:删除索引不可逆,建议先备份数据(如通过快照)。

映射(Mapping):定义字段结构

映射用于定义索引中字段的类型、分词器等属性,类似于数据库表的 “schema”。

自动映射与手动映射

  • 自动映射:当向不存在的索引写入文档时,ES 会根据字段值自动推断类型(如字符串→text+keyword,数字→long)。
    示例:

    // 写入文档时自动创建video索引及映射
    PUT video/default/1
    {
      "title": "测试视频",
      "duration": 300,
      "tags": ["科技", "教育"]
    }
  • 手动映射:推荐方式,可精确控制字段类型和行为(避免自动推断错误)。
    示例:

    PUT testmapping  // 创建索引并指定映射
    {
      "mappings": {
        "default": {  // 类型名(6.x支持,7.x后废弃)
          "properties": {  // 字段定义
            "age": {
              "type": "text",  // 全文本类型
              "fields": {
                "keyword": {  // 多字段:同时作为keyword用于聚合
                  "type": "keyword",
                  "ignore_above": 256
                }
              }
            },
            "duration": { "type": "long" },  // 数字类型
            "keywords": { "type": "text" }   // 全文本类型
          }
        }
      }
    }

查看映射

GET video/_mapping/default  // 查看video索引中default类型的映射

新增字段映射

已创建的索引可动态添加新字段(但不能修改已有字段的类型):

PUT testmapping/_mapping/default  // 为testmapping索引添加新字段
{
  "properties": {
    "type": {  // 新增type字段
      "type": "text",
      "fields": {
        "keyword": { "type": "keyword" }
      }
    }
  }
}

索引设置(Settings):配置分片与行为

索引设置用于控制分片数量、副本数量、刷新间隔等核心属性,分为静态设置(创建后不可修改)和动态设置(可实时调整)。

静态设置(创建时指定)

  • number_of_shards:主分片数量(默认 5),创建后不可修改。

    示例:

    PUT index1  // 创建只有1个主分片的索引
    {
      "settings": {
        "number_of_shards": 1
      }
    }

动态设置(可随时修改)

  • number_of_replicas:副本分片数量(默认 1),影响可用性和查询性能。
    示例:

    PUT index1/_settings  // 动态修改副本数量为2
    {
      "settings": {
        "number_of_replicas": 2
      }
    }
  • refresh_interval:索引刷新间隔(默认 1 秒),控制数据写入后可查询的延迟(值越小延迟越低,性能消耗越大)。
    示例:

    PUT index1/_settings
    {
      "settings": {
        "refresh_interval": "5s"  // 每5秒刷新一次
      }
    }
  • 恢复默认值:将参数设为 null 即可恢复默认配置:

    PUT index1/_settings
    {
      "settings": {
        "refresh_interval": null  // 恢复为默认1秒
      }
    }

查看设置

  • 查看单个索引设置:

    GET blog/_settings
  • 查看多个索引设置:

    GET index1,index2/_settings
  • 查看所有索引设置:

    GET _all/_settings

索引读写权限控制

通过 index.blocks 系列参数限制索引的读写行为:

PUT index1/_settings
{
  "settings": {
    "index.blocks.read_only": true  // 设为只读(禁止写入和更新)
    // "index.blocks.write": true  // 禁止写入(允许读取)
    // "index.blocks.read": true   // 禁止读取(允许写入)
  }
}

索引的打开与关闭

关闭索引可暂时禁用其读写功能(释放资源但保留数据),适用于不常访问的历史数据。

关闭索引

POST testmapping/_close  // 关闭testmapping索引
  • 关闭的索引不占用内存(除元数据),不能执行读写操作。

打开索引

POST testmapping/_open  // 重新打开索引

禁用关闭功能

全局配置 cluster.indices.close.enable: false 可禁止关闭索引(需在 elasticsearch.yml 中设置)。

索引别名(Aliases)

别名是索引的 “快捷方式”,可关联一个或多个索引,简化查询和索引切换(如零停机重建索引)。

添加别名

POST _aliases  // 为testmapping索引添加别名tm
{
  "actions": [
    {
      "add": {
        "index": "testmapping",
        "alias": "tm"
      }
    }
  ]
}
  • 别名可关联多个索引(如 alias: "all_videos" 关联 video_2023video_2024)。

删除别名

POST _aliases  // 移除testmapping的别名tm
{
  "actions": [
    {
      "remove": {
        "index": "testmapping",
        "alias": "tm"
      }
    }
  ]
}

查看别名

GET _cat/aliases  // 查看所有别名
GET testmapping/_alias  // 查看testmapping的别名

注意

  • 别名不能与索引名重复。
  • 一个别名可关联多个索引,但一个索引可被多个别名关联。

索引复制与重建(Reindex)

_reindex API 用于将数据从一个索引复制到另一个索引(支持条件筛选),适用于数据迁移、索引结构升级等场景。

基本复制(全量复制)

POST _reindex  // 将index1的数据复制到index2
{
  "source": { "index": "index1" },
  "dest": { "index": "index2" }
}
  • 目标索引(index2)需提前创建(可自定义分片、映射等)。
  • 原索引需开启 _source 字段(默认开启),否则无法读取原始数据。

条件复制(过滤数据)

POST _reindex  // 仅复制age=20的文档
{
  "source": {
    "index": "index1",
    "query": { "term": { "age": 20 } }  // 过滤条件
  },
  "dest": { "index": "index2" }
}

控制复制速度

通过 requests_per_second 限制每秒请求数,避免集群负载过高:

POST _reindex?requests_per_second=500  // 每秒最多500个请求
{
  "source": { "index": "index1" },
  "dest": { "index": "index2" }
}

监控与取消任务

  • 查看所有任务:

    GET _cat/tasks  // 或 GET _tasks?actions=*reindex
  • 取消任务(替换{task_id}为实际任务 ID):

    POST _tasks/{task_id}/_cancel