ES入门七:索引管理Api的使用

索引设置

在传家索引的时候,可以在"settings"字段中指定索引的位置。numbers_of_shards和nubmer_of_replicas 是索引非常重要的两个配置,设置它们值的示例如下:

我们还可以动态修改索引的位置,其示例如下:

如上示例,我们设置了索取test_index拥有2个副本分片。但值得注意的是,numbers_of_shards设定后是无法改变的,要修改索取的分片数量可以通过Reindex Api或者收缩索引的Api做处理

定义索引的Mapping

在创建索引的时候,可以设置索引的Mapping。其示例如下:

如上示例,使用"mapping"字段可以指定创建索引时的Mapping设置

如果增加了某些需求,想要增加索取的Mapping的设置,其示例如下:

需要记住,在Mapping中定义好的字段时不能修改的,如果修改将会返回404

Reindex Api

上面提到,如果Mapping中字段已经定义就不能修改其字段的类型属性了,同时也不能改变分片的数量,如果需求上必须我们修改的时候怎么办哪?可以使用Reindex Api来解决这个问题

我们需要先创建一个新的索引,使其Mapping等设置满足新的需求,然后将数据从旧的索引中迁移到新的索引。Reindex Api的使用示例如下:

bash 复制代码
# 删除索引,如果存在的话
DELETE test_index

# 创建索引
PUT test_index
{
  "mappings": {
    "properties": {
      "test_id": { "type": "keyword" },
      "test_name": { "type": "keyword" }
    }
  }
}

# 插入数据
PUT test_index/_doc/1
{
  "test_id": "123",
  "test_name": "name tes"
}

# 创建新的索引,并且满足需求
PUT test_index_reindex
{
  "mappings": {
    "properties": {
      "test_id": { "type": "keyword" },
      "test_name": { "type": "text" }
    }
  }
}

# 执行 reindex 操作
POST _reindex
{
  "source": { "index": "test_index" },
  "dest": { "index": "test_index_reindex" }
}

# 在迁移数据后的 test_index_reindex 索引中获取数据
GET test_index_reindex/_doc/1

需要注意的是,如果索引中的数据很多,并且是需要同步返回的情况下,在Kibana中执行这个操作可能会发生超时的现象。可以使用wait_for_completion=false参数来进行异步操作,其示例如下:

bash 复制代码
# 异步地执行 _reindex
POST _reindex?wait_for_completion=false
{
  "source": { "index": "test_index" },
  "dest": { "index": "test_index_reindex" }
}

# 结果
{
  "task" : "26d0dAjcRYygigd0shfz5w:35995695"
}

如上示例,异步的reindex操作返回的结果将是一个task_id,可以使用Task Api查看这个任务的情况:

bash 复制代码
GET /_tasks/26d0dAjcRYygigd0shfz5w:35995695

索引模板

可以使用 Index templates 按照一定的规则对新创建的索引进行Mapping设定和Settings设定。需要注意的是,索引模版只在索引被创建的时候起作用。创建一个模版:

bash 复制代码
PUT /_index_template/my_tmp1
{
  "index_patterns" : ["tmp_*"], # 以tmp_ 开头的索引都引用这个模板
  "priority" : 1, # 指定优先级, 数值越大优先级越高, 这个模板就越先被应用
  "template": {
    "settings" : {
      "number_of_shards" : 3
    },
    "mappings": {
      "date_detection": false
    }
  }
}

如上示例,我们创建了一个索引的模版,当以后有tmp_开头的索引创建都引用这个模版,会设置number_of_shard为3和Mappin的date_detection为false。

模版中的"priority"指定了模版的优先级,其数值越大优先级越高,这个模版就越先被应用

打开和关闭索引

当我们需要执行某些操作的时候,需要关闭索引或者打开索引,可以使用_close Api和_open Api来关闭或者打开索引

关闭索引的操作开销很小,并且会阻塞读写操作,关闭后的索引不再允许执行打开状态是的所有操作。关闭和打开索引的示例如下:

** **

bash 复制代码
# 关闭索引
POST /test_index/_close

# 打开索引
POST /test_index/_open

判断索引是否存在

当我们知道一个索引是否存在的时候,可以使用Exist Api来判断索引是否存在,其示例如下:

bash 复制代码
HEAD test_index

如上示例,如果索引存在,可以返回的HTTP状态码为200,不存在的话为404

收缩索取

如果我们一开始创建的索引其分片太多,可以使用收缩索引的Api 将索引收缩为具有较少主分配的新索引

**收缩后的新索引的主分配数量必须为源索引主分配数量的一个因子。**例如,源索引的主分片分配了12个,那么收缩的新索引的主分片为1、2、3、4、6

在进行索引收缩前需要进行以下操作:

  1. 源索引必须只读
  2. 源索引索引的副本(主分片也行、副分片也行),必须在同一个节点上,也就是在这个节点上必须有这个索引的全部数据,不管分片数据是主分片的还是副本分片的。
  3. 源索引的状态必须为健康状态(green)

下面的示例我们将拥有12个主分片,2个副本分片的索引(test_index)收缩为拥有3个主分片和1个副分片的索引(test_index_new)

新创建索引 test_index,设置 number_of_shards=12, number_of_replicas=2

bash 复制代码
# 删除索引,如果存在的话
DELETE test_index

# 创建索引
PUT test_index
{
  "mappings": {
    "properties": { "test_name": { "type": "keyword"} }
  },
  "settings": {
    "number_of_shards": 12, 
    "number_of_replicas": 2
  }
}

创建后的索引,在Cerebro中查看如下:

下面将索引test_index 所有的主分片转移到节点 my_node_1上,并且设置索引的副本分片数量为0,设置这个索引为只读:

bash 复制代码
PUT /test_index/_settings
{
  # 分片分配到 my_node_1 节点
  "index.routing.allocation.require._name": "my_node_1",
  "index.number_of_replicas": 0,
  "index.blocks.write": true  
}

ok,这个时候 test_index满足收缩索引的3个条件了,下面开始收缩:

bash 复制代码
POST /test_index/_shrink/test_index_new
{
  "settings": {
    "index.number_of_replicas": 1,
    "index.number_of_shards": 3,
    "index.routing.allocation.require._name": null, # 系统随机分配分片
    "index.blocks.write": null # 不阻塞写操作
  }
}

如上示例,我们设置新索引的主分片数量为3,每个主分片的副本数量为1,并且这些分片是系统自动、随机分配的,不阻塞新索引的写操作

最终在Cerebro可以看到,这两个索引的信息如下:

相关推荐
MonkeyKing_sunyuhua19 分钟前
ubuntu22.04 docker-compose安装postgresql数据库
数据库·docker·postgresql
天郁青19 分钟前
数据库交互的本地项目:后台管理系统
数据库·交互
马剑威(威哥爱编程)24 分钟前
MongoDB面试专题33道解析
数据库·mongodb·面试
Elastic 中国社区官方博客40 分钟前
如何将数据从 AWS S3 导入到 Elastic Cloud - 第 3 部分:Elastic S3 连接器
大数据·elasticsearch·搜索引擎·云计算·全文检索·可用性测试·aws
小光学长1 小时前
基于vue框架的的流浪宠物救助系统25128(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
数据库·vue.js·宠物
掘金-我是哪吒1 小时前
微服务mysql,redis,elasticsearch, kibana,cassandra,mongodb, kafka
redis·mysql·mongodb·elasticsearch·微服务
零炻大礼包2 小时前
【SQL server】数据库远程连接配置
数据库
Aloudata2 小时前
从Apache Atlas到Aloudata BIG,数据血缘解析有何改变?
大数据·apache·数据血缘·主动元数据·数据链路
水豚AI课代表2 小时前
分析报告、调研报告、工作方案等的提示词
大数据·人工智能·学习·chatgpt·aigc
zmgst2 小时前
canal1.1.7使用canal-adapter进行mysql同步数据
java·数据库·mysql