0%

elasticsearch索引

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

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

索引的创建与基础操作

新建索引

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

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

响应示例(成功):

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

查看索引

  • 查看单个索引:

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

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

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

删除索引

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

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

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

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

自动映射与手动映射

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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    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" } // 全文本类型
    }
    }
    }
    }

查看映射

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

新增字段映射

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

1
2
3
4
5
6
7
8
9
10
11
PUT testmapping/_mapping/default  // 为testmapping索引添加新字段
{
"properties": {
"type": { // 新增type字段
"type": "text",
"fields": {
"keyword": { "type": "keyword" }
}
}
}
}

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

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

静态设置(创建时指定)

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

    示例:

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

动态设置(可随时修改)

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

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

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

    1
    2
    3
    4
    5
    6
    PUT index1/_settings
    {
    "settings": {
    "refresh_interval": null // 恢复为默认1秒
    }
    }

查看设置

  • 查看单个索引设置:

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

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

    1
    GET _all/_settings

索引读写权限控制

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

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

索引的打开与关闭

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

关闭索引

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

打开索引

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

禁用关闭功能

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

索引别名(Aliases)

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

添加别名

1
2
3
4
5
6
7
8
9
10
11
POST _aliases  // 为testmapping索引添加别名tm
{
"actions": [
{
"add": {
"index": "testmapping",
"alias": "tm"
}
}
]
}
  • 别名可关联多个索引(如 alias: "all_videos" 关联 video_2023video_2024)。

删除别名

1
2
3
4
5
6
7
8
9
10
11
POST _aliases  // 移除testmapping的别名tm
{
"actions": [
{
"remove": {
"index": "testmapping",
"alias": "tm"
}
}
]
}

查看别名

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

注意

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

索引复制与重建(Reindex)

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

基本复制(全量复制)

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

条件复制(过滤数据)

1
2
3
4
5
6
7
8
POST _reindex  // 仅复制age=20的文档
{
"source": {
"index": "index1",
"query": { "term": { "age": 20 } } // 过滤条件
},
"dest": { "index": "index2" }
}

控制复制速度

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

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

监控与取消任务

  • 查看所有任务:

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

    1
    POST _tasks/{task_id}/_cancel

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

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