优秀的编程知识分享平台

网站首页 > 技术文章 正文

「必备技能」Elasticsearch索引全生命周期管理(附代码)

nanyue 2024-10-21 06:14:10 技术文章 1 ℃

索引(Index)是Elasticsearch中最重要的概念之一,也是整个Elasticsearch操作的基础,Elasticsearch提供了Index APIs用于Elasticsearch生命周期的管理,包括索引的创建、查询、删除和设置,索引的冻结和解冻、拆分和收缩等,掌握索引的管理是Elasticsearch开发、运维的基础能力,也有助于后期对于Elasticsearch的优化。

01、索引增删改查一、创建索引

创建一个索引可以使用Elasticsearch提供的API,其格式如下:

PUT /<index>

其中<index>为要创建的索引的名称,是一个必须的参数,所有的字母都必须是小写形式。在创建索引的同时还可以进行相关的设置:

  • 分片的数量、副本的数量等。
  • 索引字段的映射
  • 索引别名设置

一个不做任何设置的,单纯创建索引的请求如下:

curl -X PUT "localhost:9200/my-index-000001?pretty"

{
"acknowledged" : true,
"shards_acknowledged" : true,
"index" : "my-index-000001"
}

响应体中“acknowledged”为true代表索引已经成功在Elasticsearch集群中创建,“shards_acknowledged”为true则代表在请求超时之前所有的索引分片的副本分片也全部准备完毕。当然,即使“acknowledged”"shards_acknowledged"都为false,只能代表超时之前没有完成,后续集群还是可能最终成功创建了索引。

创建索引的API还支持Query Parameters和Request Body,其中的参数均是可选的参数

Query Parameters支持以下参数:

  • wait_for_active_shards
    代表请求等待多少个分片active以后返回,默认值为1,代表只等待主分片返回即可。设置为all则代表等待所有的分片为active(主分片和副本分片),可以设置为1~(number_of_replicas+1)
  • master_timeout
    代表连接主节点的超时时间,默认为30s。
  • timeout
    等待响应的超时时间,默认为30s。

Request Body也支持三个参数:

  • aliases
    aliases是一个<alias>数组对象,内部对象alias是一个必须的参数,可以有以下的属性,这些属性本身都是可选的:
    1、filter
    DSL表达式,用于限制使用别名可以访问的文档。
    2、index_routing
    用于进行索引时计算分片,如果指定了这个值将会在索引的时候覆盖默认的routing
    3、is_hidden
    布尔值,默认为false,当设置为true时代表别名是隐藏不可用的,所有拥有相同别名的索引的is_hidden的值必须是设置成一样的。
    4、is_write_index
    标记作为别名的写索引,一个别名同时只能有一个写索引,默认为false。
    5、routing
    用于索引和查询时路由到对应的分片。
    6、search_routing
    用于进行搜索时计算分片,如果指定了这个值将会在搜索的时候覆盖默认的routing
  • mappings
    mappings参数指定了索引的字段的映射关系,包括字段名称、字段类型、映射参数等。
  • settings
    针对单个索引级别的设置,可以分为static(静态)和dynamic(动态)索引设置,static静态设置只能用于索引创建或者已关闭的索引,而dynamic的设置可以是针对一个活跃的索引生效,这些设置可以是主分片数量、副本分片数量等。

以下代码示例同时指定了Query Parameters和Request Body

curl -X PUT -H 'Content-Type:application/json' --data
'{
"settings":{
"index":{
"number_of_shards":3,
"number_of_replicas":2
}
},
"mappings":{
"user":{
"properties":{
"id":{
"type":"keyword"
},
"name":{
"type":"text"
}
}
}
},
"aliases":{
"alias_1":{

},
"alias_2":{
"filter":{
"term":{
"id":"440581873934746511"
}
},
"routing":"shard-1",
"is_hidden":false,
"is_write_index":false
}
}
}' "localhost:9200/my-index-000001?pretty&wait_for_active_shards=1&master_timeout=60s&timeout=60s"

二、查询索引

通过Get index API,可以查询一个或者多个索引的相关信息,其API格式如下:

GET /<target>

其中target可以是数据流、索引,还可以是一个别名,多个索引之间使用逗号分隔,target还支持模糊查询(*),如果查询所有的索引,可以使用*或者_all。如果集群开启了安全权限控制,那么要查询索引信息需要获得view_index_metadata或者manage的索引操作权限。以下为查询的具体案例:

curl -X GET "localhost:9200/my-index-000001?pretty"

Get index API支持带url查询参数,这些参数都是可选参数,主要有以下几个:

  • allow_no_indices
    默认为true,如果为false的话,则如果使用了模糊查询、索引别名、_all作为目标查询,则一旦没有对应的索引或者索引已关闭,则返回错误。即便是多目标查询,如“foo*,boo*”,存在foo开头的索引而不存在boo开头的索引的话,也会返回错误。
  • expand_wildcards
    指示了如果使用了模糊查询,可以匹配的索引的类型(状态),默认值为open其值可以是all、open、closed、hidden和none中的一个。
  • features
    指定返回的索引的信息,多个值之间可以使用逗号分隔,可选值为:aliases,mappingssettings,默认值为aliases,mappings,settings
  • flat_settings
    如果设置为true,代表返回的settings信息以水平的格式返回,默认值为false。
  • include_defaults
    是否在响应中返回默认的设置,默认为false,这个值比较有用,设置为true可以看到所有的默认值。
  • ignore_unavaliable
    默认值为false,一旦查询的索引不存在则报错。
  • local
    如果为true,请求只从本地节点获取信息。默认为false,这意味着从主节点检索信息。
  • master_timeout
    连接到主节点的超时时间。

三、修改索引

首先需要明确索引本身是不能被修改的,当我们说修改索引时,实际上是指修改索引的别名、字段映射(mapping)和配置(settings)。

  • 修改别名

首先说明一下别名的作用。Elasticsearch提供了别名的功能,一个别名可以添加多个索引,方便通过操作一个别名实际上操作到多个具体的索引,例如每年建一个索引,分别有index-2019,index-2020,index-2021,index-2022共4个索引,这4个索引都关联了别名index-year,当需要查询最近4年的数据的时候,可以使用index-year同时查询这4个年份的索引。

别名的修改,实际上是从索引上删除别名,再重新添加新的别名,将这两个动作放在一起,保证其原子性,确保不会存在别名被删除的瞬间产生没有指向任何索引的问题。

以下代码为将my-index从索引my-index-000001解除,然后重新绑定在索引my-index-000002上。

POST /_aliases

{

"actions" : [

{ "remove" : { "index" : "my-index-000001", "alias" : "my-index" } },

{ "add" : { "index" : "my-index-000002", "alias" : "my-index" } }

]

}
  • 修改mapping

mapping指定了索引的数据结构,字段类型,修改索引的mapping,可以修改原有字段的名称、类型,添加新的字段等。以下为添加新的email字段,类型为keyword。

curl -X PUT "localhost:9200/my-index-000001/_mapping?pretty" -H 'Content-Type: application/json' -d'
{
"properties": {
"email": {
"type": "keyword"
}
}
}
'
  • 修改settings

支持多个索引、data stream和别名,支持模糊搜索,使用*或者_all可以指定所有的data stream和别名。

以下为修改settings的案例,设置索引有2个主分片,2个副本。

curl -X PUT "localhost:9200/my-index-000001/_settings?pretty" -H 'Content-Type: application/json' -d'
{
"index" : {
"number_of_replicas" : 2,
"number_of_shards":2
}
}
'

四、删除索引

删除索引将会删除其对应的文档、分片和集群中的元数据信息,索引的操作是一个高危操作,需要慎重,如果集群开启了安全权限控制,那么要删除索引,需要获得delete_index或者manage的索引操作权限。

不能删除数据流(data stream)的写索引,要删除当前写索引,必须对data stream进行rollover,创建新的写索引。

删除索引的API如下:

DELETE /<index>

<index>是必须参数,指定索引名称,多个索引可以用逗号分割,不支持使用别名,默认情况下也不支持使用模糊匹配,确实需要使用模糊匹配的,需要将集群参数action.destructive_requires_name设置为false。 Delete Index API类似Get Index API,同样支持URL查询参数,这些参数包括allow_no_indicesexpand_wildcardsignore_unavailablemaster_timeouttimeout,含义类似,不再赘述。 以下是删除索引的案例代码:

curl -X DELETE "localhost:9200/my-index-000001?pretty"

02、索引关闭和打开一、关闭索引

默认情况下,索引一旦被创建出来就是打开的状态,但是在某些情况下可能需要关闭索引,例如一些老旧不需要使用到的索引,仍然占用一定的空间,并且集群仍然需要一定的维护开销,关闭索引将阻塞所有对这个索引的读/写操作,关闭的索引不必维护索引或搜索文档的内部数据结构,从而可以减少集群上开销。

特别注意:关闭索引的操作会消耗大量磁盘空间,在生产上也是一个需要特别注意的操作。可以通过集群设置API将cluster.indices.close.enable设置为false来禁用索引的关闭,默认为true。

curl -X POST "localhost:9200/my-index-000001/_close?pretty"
{
"acknowledged": true,
"shards_acknowledged": true,
"indices": {
"my-index-000001": {
"closed": true
}
}
}

当一个索引被打开或者关闭,master节点负责重启分片,这些分片都会经历recovery过程,打开或者关闭索引后都会自动进行分片数据的复制,以保证有足够的副本分片以保证高可用性。

默认情况下只支持匹配全名称的特定的索引,但是如果设置了参数action.destructive_requires_name为false,则可以使用*或者_all指代所有的索引,但这种情况下一旦有一个索引匹配失败则会报错,不建议开启。

二、打开索引

curl -X POST "localhost:9200/my-index-000001/_open?pretty"
{
"acknowledged" : true,
"shards_acknowledged" : true
}

open API用于重新打开被关闭的索引,如果目标是一个data stream,则打开这个data stream背后对应的所有的索引。

默认情况下只支持匹配全名称的特定的索引,但是如果设置了参数action.destructive_requires_name为false,则可以使用*或者_all指代所有的索引,但这种情况下一旦有一个索引匹配失败则会报错。

03、索引收缩和拆分

索引收缩和拆分是指收缩或者拆分索引的主分片数量。首先,我们要明白为什么需要进行索引的收缩和拆分呢?

在 elasticsearch 中,主节点管理分片是很大的工作量,降低集群整体分片数量可以降低 recovery 时间,减小集群状态的大小,降低集群的维护消耗。在很多情况下,经历了一段时间的运行以后,一些冷索引不会再有数据写入,将一些小分片合并可以降低集群的维护成本。

另一方面,如果在业务运行过程中发现前期的预估不足,业务量较大导致单个分片过大,则需要进行索引的拆分扩大主分片的数量。
一、索引收缩

Elasticsearch从5.0版本起提供了 shrink API,用于针对一些小索引缩小索引分片数。实际上并不对源索引进行操作,而是使用与源索引相同的配置创建一个新索引,仅仅降低分片数,索引分片缩小完成后,源索引可删除。

一个索引要能够被shrink API进行分片缩小,需要满足以下三个条件:

  • 索引是只读的
  • 索引中每个分片的副本必须位于同一个节点上。(注意,“所有分片副本”不是指索引的全部分片,无论主分片还是副分片,满足任意一个就可以,分配器也不允许将主副分片分配到同一节点。所以可以是删除了所有的副本分片,也可以是把所有的副本分片全部放在同一个节点上。)
  • 索引的状态必须为green

为了使分片分配更容易,可以先删除索引的复制分片,等完成了shrink操作以后再重新添加复制分片。

可以使用以下代码,实现删除所有的副本分片,将所有的主分片分配到同一个节点上,并且设置索引状态为只读:

curl -X PUT "localhost:9200/my_source_index/_settings?pretty" -H 'Content-Type: application/json' -d'
{
"settings": {
"index.number_of_replicas": 0,  
"index.routing.allocation.require._name": "shrink_node_name", 
"index.blocks.write": true  
}
}
'

重新分配源索引的分片可能需要一段时间,可以使用_cat API跟踪进度,或者使用集群健康API通过wait_for_no_relocating_shards参数等待所有分片完成重新分配。

当完成以上步骤以后就可以进行shrink操作了,以下为_shrink API的格式:

POST /<index>/_shrink/<target-index>

PUT /<index>/_shrink/<target-index>

以下案例将索引my-index-000001缩小主分片到shrunk-my-index-000001索引。

curl -X POST "localhost:9200/my-index-000001/_shrink/shrunk-my-index-000001?pretty"
{
"settings": {
"index.number_of_replicas": 1,
"index.number_of_shards": 1,
"index.codec": "best_compression"
"index.routing.allocation.require._name": null, 
"index.blocks.write": null 
}
"aliases": {
"my_search_indices": {}
}
}

特别注意:由于添加新文档时使用对分片数量取余获取目标分片,因此目标索引中请求的主分片数量必须是源索引中主分片数量的一个因子。例如,包含8个主分片的索引可以收缩为4个、2个或1个主分片,或者包含15个主分片片的索引可以收缩为5个、3个或1个主分片。如果索引中的分片数量是一个质数,那么它只能收缩为一个主分片。

如果当前索引是是一个data stream的写索引,则不允许进行索引收缩,需要对data stream进行rollover,创建一个新的写索引,才可以对当前索引进行收缩。

整个索引收缩的过程如下:

  1. 创建一个新的目标索引,其定义与源索引相同,但主分片的数量较少。
  2. 将段从源索引硬链接到目标索引。(如果文件系统不支持硬链接,那么所有的段都被复制到新的索引中,这是一个非常耗时的过程。此外,如果使用多个数据路径,并且不同数据路径不在同一个磁盘上,由于硬链接不能跨磁盘工作,因此需要一个完整的段文件拷贝。)
  3. 恢复目标索引,就好像它是一个刚刚重新打开的关闭索引。

二、索引拆分2.1、使用索引拆分API

同样地,Elasticsearch还提供了Split API,用于将索引拆分到具有更多主分片的新索引。Split API的格式如下:

POST /<index>/_split/<target-index>

PUT /<index>/_split/<target-index>

要完成整个Split的操作需要满足以下条件:

  • 索引必须是只读的。
  • 集群的状态必须是green。
  • 目标索引的主分片数量必须大于源索引的主分片数量。
  • 处理索引拆分的节点必须有足够的空闲磁盘空间来容纳现有索引的第二个副本。

以下API请求可以将索引设置为只读:

curl -X PUT "localhost:9200/my_source_index/_settings?pretty" -H 'Content-Type: application/json' -d'
{
"settings": {
"index.blocks.write": true 
}
}
'

如果当前索引是是一个data stream的写索引,则不允许进行索引拆分,需要对data stream进行rollover,创建一个新的写索引,才可以对当前索引进行拆分。

以下是使用Split API进行索引拆分的请求案例,Split API支持settingsaliases

curl -X POST "localhost:9200/my-index-000001/_split/split-my-index-000001?pretty" -H'Content-Type: application/json' -d'
{
"settings": {
"index.number_of_shards": 2
},
"aliases": {
"my_alias":{}
}
}
'

index.number_of_shards指定的主分片的数量 必须是源分片数量的倍数。

索引拆分可以拆分的分片的数量由参数index.number_of_routing_shards决定,路由分片的数量指定哈希空间,该空间在内部用于以一致性哈希的形式在各个 shard 之间分发文档。 例如,将 number_of_routing_shards 设置为30(5 x 2 x 3)的具有5个分片的索引可以拆分为 以2倍 或 3倍的形式进行拆分。换句话说,可以如下拆分:

5→10→30(拆分依次为2和3)

5→15→30(拆分依次为3和2)

5→30(拆分6)

index.number_of_routing_shards 是一个静态配置,可以在创建索引的时候指定,也可以在关闭的索引上设置。其默认值取决于原始索引中主分片的数量,默认情况下,允许按2的倍数分割最多1024个分片。但是,必须考虑主分片的原始数量。例如,使用5个分片创建的索引可以被分割为10、20、40、80、160、320,或最多640个分片。

如果源索引只有一个主分片,那么可以被拆分成为任意数量的主分片。
2.2、索引拆分的工作过程

  1. 创建一个与源索引定义一样的目标索引,并且具有更多的主分片。
  2. 将段从源索引硬链接到目标索引。(如果文件系统不支持硬链接,那么所有的段都会被复制到新的索引中,这是一个非常耗时的过程。)
  3. 对所有的文档进行重新散列。
  4. 目标索引进行Recovery。

2.3、为什么Elasticsearch不支持增量的重新分片?

大多数的键值存储都支持随着数据的增长实现自动分片的自动扩展,为什么Elasticsearch不支持呢?

最经典的方案在于新增一个分片,然后将新的数据存储到这个新增加的分片,但是这种方案在Elasticsearch中可能会造成索引的瓶颈,整体的结构会变得比较复杂,因为Elasticsearch需要去定位文档到底归属于在哪一个分片,这意味着需要使用不同的哈希方案重新平衡现有数据。

键值存储系统解决这个问题的方案一般是使用一致性哈希,当分片数从N增加到N+1时,一致性哈希只需要对1/N的key进行重新分配,例如redis集群的方案就是蕾丝如此。

但是Elasticsearch分片的底层实际上上是Lucene的索引,而从Lucene索引删除一小部分的数据,通常比键值存储系统的成本要高得多。所以Elasticsearch选择在索引层面上进行拆分,使用硬链接进行高效的文件复制,以避免在索引间移动文档。

对于仅追加数据而没有修改、删除等场景,可以通过创建一个新索引并将新数据推送到该索引,同时添加一个用于读操作的涵盖旧索引和新索引的别名来获得更大的灵活性。假设旧索引和新索引分别有M和N个分片,这与搜索一个有M+N个分片的索引相比没有任何开销。

2.4、如何监控Split的进度

使用Split API进行索引拆分,API正常返回并不意味着Split的过程已经完成,这仅仅意味着创建目标索引的请求已经完成,并且加入了集群状态,此时主分片可能还未被分配,副本分片可能还未创建成功。

一旦主分片完成了分配,状态就会转化为initializing,并且开始进行拆分过程,直到拆分过程完成,分片的状态将会变成active

可以使用_cat recovery API来监控Split进程,或者可以使用集群健康API通过将wait_for_status参数设置为黄色来等待所有主分片分配完毕。

04、索引克隆一、为什么需要进行索引克隆

Elasticsearch Clone API可以用于Elasticsearch索引数据的复制和备份。
二、索引克隆API

索引克隆不会克隆源索引的元数据,包括别名、ILM阶段定义、CCR follower相关信息,克隆API将会复制除了index.number_of_replicas和index.auto_expand_replicas之外的所有配置,这两个特殊的配置可以在克隆API的请求中显式指定。Clone API的格式如下:

POST /<index>/_clone/<target-index>

PUT /<index>/_clone/<target-index>

索引满足可以克隆的条件是:

  1. 源索引是只读的
  2. 整个集群的状态是green的。
  3. 处理索引拆分的节点必须有足够的空闲磁盘空间来容纳现有索引的第二个副本。

参照之前讲过的内容,仍然可以通过将index.blocks.write设置为true来确保索引是可读的状态。以下是克隆API的案例:

curl -X POST "localhost:9200/my_source_index/_clone/my_target_index?pretty" -H'Content-Type: application/json' -d'
{
"settings": {
"index.number_of_shards": 5 
},
"aliases": {
"my_search_indices": {}
}
}
'

注意:index.number_of_shards的值必须与源索引的主分片数量一致。
三、索引克隆的过程

  1. 创建一个具备和源索引定义一样的目标索引。
  2. 然后将源索引中的段(segment)硬链接到目标索引中。
  3. 目标索引进行Recover。

四、监控克隆的进度

使用Clone API进行索引的克隆,API正常返回并不意味着Clone的过程已经完成,这仅仅意味着创建目标索引的请求已经完成,并且加入了集群状态,此时主分片可能还未被分配,副本分片可能还未创建成功。

一旦主分片完成了分配,状态就会转化为initializing,并且开始进行克隆过程,直到克隆过程完成,分片的状态将会变成active

可以使用_cat recovery API来监控Clone进程,或者可以使用集群健康API通过将wait_for_status参数设置为黄色来等待所有主分片分配完毕。

05、滚动索引

rollover API是Elasticsearch提供的一个很好用的功能。我们都知道在MySQL中一旦数据量比较大,可能会存在分库分表的情况,例如根据时间每个月一个表。rollover功能就类似这种情况,它的原理是先创建一个带别名的索引,然后设定一定的规则(例如满足一定的时间范围的条件),当满足该设定规则的时候,Elasticsearch会自动建立新的索引,别名也自动切换指向新的索引,这样相当于在物理层面自动建立了索引的分区功能,当查询数据落在特定时间内时,会到一个相对小的索引中查询,相对所有数据都存储在一个大索引的情况,可以有效提升查询效率。

rollover API会为data stream或者索引别名创建一个新的索引。(在Elasticsearch 7.9之前,一般使用索引别名的方式来管理时间序列数据,在Elasticsearch之后data stream取代了这个功能,它需要更少的维护,并自动与数据层集成)。

rollover API的效果依据待滚动的索引别名的情况不同而有不同的表现:

  1. 如果一个索引别名对应了多个索引,其中一个一定是写索引,rollover创建出新索引的时候会设置is_write_indextrue,并且上一个被滚动的索引的is_write_index设置为false
  2. 如果待滚动的索引别名对应的只有一个索引,那么在创建新的索引的同时,会删除原索引。

使用rollover API的时候如果指定新的索引的名称,并且原索引以“-”结束并且以数字结尾,那么新索引将会沿用名称并且将数字增加,例如原索引是my-index-000001那么新索引会是my-index-000002

如果对时间序列数据使用索引别名,则可以在索引名称中使用日期来跟踪滚动日期。例如,可以创建一个别名来指向名为<my-index-{now/d}-000001>的索引,如果在2099年5月6日创建索引,则索引的名称为my-index-2099.05.06-000001。如果在2099年5月7日滚动别名,则新索引的名称为my-index-2099.05.07-000002

rollover API的格式如下:

POST /<rollover-target>/_rollover/

POST /<rollover-target>/_rollover/<target-index>

rollover API也支持Query Parameters和Request Body,其中Query parameters支持wait_for_active_shardsmaster_timeouttimeoutdry_run,特别说一下dry_run,如果将dry_run设置为true,那么这次请求不会真的执行,但是会检查当前索引是否满足conditions指定的条件,这对于提前进行测试非常有用。

Request Body支持aliasesmappingssettings(这三个参数只支持索引,不支持data stream)和conditions

特别展开讲一下conditions。这是一个可选参数,如果指定了conditions,则需要在满足conditions指定的一个或者多个条件的情况下才会执行滚动,如果没有指定则无条件滚动,如果需要自动滚动,可以使用ILM Rollover。

conditions支持的属性有:

  • max_age
    从索引建立开始算起的时间周期,支持Time Units,如7d、4h、30m、60s、1000ms、10000micros、500000nanos。
  • max_docs
    索引主分片的数量达到设定的值;
  • max_size
    所有主分片的大小之和达到了设定值,可以通过_cat indices API进行查询,其中pri.store.size的值就是目标值。
  • max_primary_shard_size
    所有主分片中存在主分片的大小达到了设定值,可以通过_cat shards API查看分片的大小,store值代表每个分片的大小,prirep代表了分片是primary分片还是replica分片。
  • max_primary_shard_docs
    所有主分片中存在主分片的文档大小达到了设定值,可以通过_cat shards API查询,其中的docs字段代表了分片上文档数量的大小。

以下为rollover一个data stream的一个案例:

curl -X POST "localhost:9200/my-data-stream/_rollover?pretty" -H 'Content-Type: application/json' -d'
{
"conditions": {
"max_age": "7d",
"max_docs": 1000,
"max_primary_shard_size": "50gb",
"max_primary_shard_docs": "2000"
}
}
'

响应信息如下:

{
"acknowledged": true,
"shards_acknowledged": true,
"old_index": ".ds-my-data-stream-2099.05.06-000001",
"new_index": ".ds-my-data-stream-2099.05.07-000002",
"rolled_over": true,
"dry_run": false,
"conditions": {
"[max_age: 7d]": false,
"[max_docs: 1000]": true,
"[max_primary_shard_size: 50gb]": false,
"[max_primary_shard_docs: 2000]": false
}
}

以下为rollover一个索引别名的一个案例:

  1. 创建一个索引并且设置为write index
# PUT <my-index-{now/d}-000001>
curl -X PUT "localhost:9200/%3Cmy-index-%7Bnow%2Fd%7D-000001%3E?pretty" -H 'Content-Type: application/json' -d'
{
"aliases": {
"my-alias": {
"is_write_index": true
}
}
}
'

2. 请求rollover API

curl -X POST "localhost:9200/my-alias/_rollover?pretty" -H 'Content-Type: application/json' -d'
{
"conditions": {
"max_age": "7d",
"max_docs": 1000,
"max_primary_shard_size": "50gb",
"max_primary_shard_docs": "2000"
}
}
'

如果别名的索引名称使用日期数学表达式,并且按定期间隔滚动索引,则可以使用日期数学表达式来缩小搜索范围。例如,下面的搜索目标是最近三天内创建的索引。

# GET /<my-index-{now/d}-*>,<my-index-{now/d-1d}-*>,<my-index-{now/d-2d}-*>/_search
curl -X GET "localhost:9200/%3Cmy-index-%7Bnow%2Fd%7D-*%3E%2C%3Cmy-index-%7Bnow%2Fd-1d%7D-*%3E%2C%3Cmy-index-%7Bnow%2Fd-2d%7D-*%3E/_search?pretty"

06、索引冻结和解冻

索引的冻结是Elasticsearch提供的一个用于减少内存开销的操作,这个功能在7.14版本中被标记为Deprecated,在Version 8以后,已经对堆内存的使用进行了改进,冻结和解冻的功能不再适用。

这里简单地进行操作演示,如果是7.x版本仍然可以作为参照。

一、索引冻结

索引被冻结以后除了在内存中维护其元数据之外,在集群上几乎没有任何的开销。被冻结以后,索引是只读的,所有的写操作都将会被阻塞,例如文档的写入、merge合并等。

API格式如下:

POST /<index>/_freeze

以下为索引冻结操作的代码案例:

curl -X POST "localhost:9200/my-index-000001/_freeze?pretty"

注意,冻结索引将关闭该索引,并在同一个API调用中重新打开它,这将导致在短时间内主分配没有被分配,并导致集群变为红色,直到再次完成分配。

二、索引解冻

对应索引的冻结,解冻的API格式如下:

POST /<index>/_unfreeze

以下为索引解冻操作的代码案例:

curl -X POST "localhost:9200/my-index-000001/_unfreeze?pretty"

07、索引解析

Elasticsearch提供了Resolve index API用于辅助进行索引的解析,根据提供的索引/别名/数据流的名称或者模式匹配,查询出当前集群中匹配的索引的信息。以下为API的格式:

GET /_resolve/index/<name>

案例如下:

curl -X GET "localhost:9200/_resolve/index/f*,remoteCluster1:bar*?expand_wildcards=all&pretty"
{
"indices": [  
{
"name": "foo_closed",
"attributes": [
"closed"  
]
},
{
"name": "freeze-index",
"aliases": [
"f-alias"
],
"attributes": [
"open"
]
},
{
"name": "remoteCluster1:bar-01",
"attributes": [
"open"
]
}
],
"aliases": [  
{
"name": "f-alias",
"indices": [
"freeze-index",
"my-index-000001"
]
}
],
"data_streams": [  
{
"name": "foo",
"backing_indices": [
".ds-foo-2099.03.07-000001"
],
"timestamp_field": "@timestamp"
}
]
}

这个API的作用多为辅助,实际使用不多,细节的参数可以参考官方的文档。

更多干货文章,微信搜索关注“ElasticExpert”

跟我一起奋斗成为Elastic专家

最近发表
标签列表