Elasticsearch索引全生命周期
索引(Index)是Elasticsearch中最重要的概念之一,也是整个Elasticsearch操作的基础,它是相互关联的文档的一个集合。在Elasticsearch种,数据存储为 JSON 文档,每个文档将一组键(字段或属性的名称)与其对应的值(字符串、数字、布尔值、日期、地理位置或其他类型的数据)相关联,Elasticsearch 使用一种称为倒排索引的数据结构,旨在实现非常快速的全文搜索。倒排索引列出了出现在任何文档中的每个唯一单词,并标识了每个单词出现的所有文档。
Elasticsearch提供了Index APIs用于Elasticsearch生命周期的管理,包括索引的创建、查询、删除和设置,索引的冻结和解冻、拆分和收缩等,掌握索引的管理是Elasticsearch开发、运维的基础能力,也有助于Elasticsearch的优化。
一、索引增删改查
1 .1、创建索引
创建一个索引可以使用Elasticsearch提供的API,其格式如下:
PUT /<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是一个必须的参数,可以有以下的属性,这些属性本身都是可选的:
- filter
DSL表达式,用于限制使用别名可以访问的文档。
index_routing
用于进行索引时计算分片,如果指定了这个值将会在索引的时候覆盖默认的routing。
is_hidden
布尔值,默认为false,当设置为true时代表别名是隐藏不可用的,所有拥有相同别名的索引的is_hidden的值必须是设置成一样的。
is_write_index
标记作为别名的写索引,一个别名同时只能有一个写索引,默认为false。
routing
用于索引和查询时路由到对应的分片。
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"
1.2、查询索引
通过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,mappings和settings,默认值为aliases,mappings,settings。
flat_settings
如果设置为true,代表返回的settings信息以水平的格式返回,默认值为false。
include_defaults
是否在响应中返回默认的设置,默认为false,这个值比较有用,设置为true可以看到所有的默认值。
ignore_unavaliable
默认值为false,一旦查询的索引不存在则报错。
local
如果为true,请求只从本地节点获取信息。默认为false,这意味着从主节点检索信息。
master_timeout
连接到主节点的超时时间。
1.3、修改索引
索引本身是不能被修改的,当我们说修改索引,实际上是指修改索引的别名、字段映射(mapping)和配置(settings)。
修改别名
别名的修改,是通过同时执行remove和add操作来实现的,该操作中的两个动作是原子性的,不会存在别名被删除的瞬间产生没有指向任何索引的问题,以下代码为将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
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和别名。
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 }}'
1.4、删除索引
删除索引将删除其文档、分片和元数据。它不删除相关的Kibana组件,如数据视图、可视化或仪表板。
如果集群开启了安全权限控制,那么要查询索引信息需要获得delete_index或者manage的索引操作权限。
删除索引将删除其文档、分片和元数据。它不删除相关的Kibana组件,如数据视图、可视化或仪表板。
不能删除数据流(data stream)的写索引,要删除当前写索引,必须滚动data stream,创建新的写索引。
删除索引的API如下:
DELETE /<index>
是必须参数,指定索引名称,多个索引可以用逗号分割,不支持使用别名,默认情况下也不支持使用模糊匹配,确实需要使用模糊匹配的,需要将集群参数action.destructive_requires_name设置为false。
Delete Index API类似Get Index API,同样支持URL查询参数,这些参数包括allow_no_indices、expand_wildcards、ignore_unavailable、master_timeout、timeout,含义类似,不再赘述。
以下是删除索引的案例代码:
curl -X DELETE "localhost:9200/my-index-000001?pretty"
二、索引关闭和打开
2.1、关闭索引
默认情况下,索引一旦被创建出来就是打开的状态,但是在某些情况下可能需要关闭索引,例如一旦老旧不需要使用到的索引。关闭索引将阻塞所有对这个索引的读/写操作,关闭的索引不必维护索引或搜索文档的内部数据结构,从而可以减少集群上开销。
关闭索引的操作做会消耗大量磁盘空间,这可能会在托管环境中导致问题。可以通过集群设置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指代所有的索引,但这种情况下一旦有一个索引匹配失败则会报错。
2.2、打开索引
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指代所有的索引,但这种情况下一旦有一个索引匹配失败则会报错。
三、索引收缩和拆分
3.1、索引收缩
对于索引分片数量,我们一般在模板中统一定义,在数据规模比较大的集群中,索引分片数一般也大一些,在我的集群中设置为 24。但是,并不是所有的索引数据量都很大,这些小数据量的索引也同样有较大的分片数。在 elasticsearch 中,主节点管理分片是很大的工作量,降低集群整体分片数量可以降低 recovery 时间,减小集群状态的大小。很多时候,冷索引不会再有数据写入,此时,可以使用 shrink API 缩小索引分配数。缩小完成后,源索引可删除。
shrink API 是 ES5.0之后提供的新功能,他并不对源索引进行操作,他使用与源索引相同的配置创建一个新索引,仅仅降低分配数。由于添加新文档时使用对分片数量取余获取目的分片的关系,原分片数量是新分片倍数。如果源索引的分片数为素数,目标索引的分片数只能为1.
将现有索引缩小为具有更少主分片的新索引,一个索引要能够被shrink进行缩小,需要满足以下三个条件:
索引是可读的
索引中每个分片的副本必须位于同一个节点上。(注意,“所有分片副本”不是指索引的全部分片,无论主分片还是副分片,满足任意一个就可以,分配器也不允许将主副分片分配到同一节点。所以可以是删除了所有的副本分片,也可以是把所有的副本分片全部放在同一个节点上。)
索引的状态必须为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": {} }}
收缩索引API允许您将现有索引收缩为主分片更少的新索引。目标索引中请求的主分片数量必须是源索引中主分片数量的一个因子。例如,包含8个主碎片的索引可以收缩为4个、2个或1个主碎片,或者包含15个主碎片的索引可以收缩为5个、3个或1个主碎片。如果索引中的碎片数量是一个质数,那么它只能收缩为一个主分片。在收缩之前,索引中每个分片的一个(主或副本)副本必须存在于同一个节点上。
如果当前索引是是一个data stream的写索引,则不允许进行索引收缩,需要对data stream进行回滚,创建一个新的写索引,才可以对当前索引进行收缩。
整个索引收缩的过程如下:
创建一个新的目标索引,其定义与源索引相同,但主分片的数量较少。
将段从源索引硬链接到目标索引。(如果文件系统不支持硬链接,那么所有的段都被复制到新的索引中,这是一个非常耗时的过程。此外,如果使用多个数据路径,不同数据路径上的分片需要一个完整的段文件拷贝,如果它们不在同一个磁盘上,因为硬链接不能跨磁盘工作)
恢复目标索引,就好像它是一个刚刚重新打开的关闭索引。
3.2、索引拆分
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进行回滚,创建一个新的写索引,才可以对当前索引进行拆分。
以下是使用Split API进行索引拆分的请求案例,Split API支持settings和aliases。
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个碎片。
如果源索引只有一个主分片,那么可以被拆分成为任意数量的主分片。
3.2.1、索引拆分的工作过程
创建一个与源索引定义一样的目标索引,并且具有更多的主分片。
将段从源索引硬链接到目标索引。(如果文件系统不支持硬链接,那么所有的段都会被复制到新的索引中,这是一个非常耗时的过程。)
对所有的文档进行重新散列。
目标索引进行Recover。
3.2.2、为什么Elasticsearch不支持增量的重新分片?
大多数的键值存储都支持随着数据的增长实现自动分片的自动扩展,为什么Elasticsearch不支持呢?
最经典的方案在于新增一个分片,然后将新的数据存储到这个新增加的分片,但是这种方案在Elasticsearch中可能会造成索引的瓶颈,整体的结构会变得比较复杂,因为Elasticsearch需要去定位文档到底归属于在哪一个分片,这意味着需要使用不同的哈希方案重新平衡现有数据。
键值存储系统解决这个问题的方案一般是使用一致性哈希,当分片数从N增加到N+1时,一致性哈希只需要对1/N的key进行重新分配。但是Elasticsearch分片的本质实际上是Lucene的索引,而从Lucene索引删除一小部分的数据,通常比键值存储系统的成本要高得多。所以Elasticsearch选择在索引层面上进行拆分,使用硬链接进行高效的文件复制,以避免在索引间移动文档。
对于仅追加数据而没有修改、删除等场景,可以通过创建一个新索引并将新数据推送到该索引,同时添加一个用于读操作的涵盖旧索引和新索引的别名来获得更大的灵活性。假设旧索引和新索引分别有M和N个分片,这与搜索一个有M+N个分片的索引相比没有任何开销。
3.2.3、如何监控Split的进度
使用Split API进行索引拆分,API正常返回并不意味着Split的过程已经完成,这仅仅意味着创建目标索引的请求已经完成,并且加入了集群状态,此时主分片可能还未被分配,副本分片可能还未创建成功。
一旦主分片完成了分配,状态就会转化为initializing,并且开始进行拆分过程,直到拆分过程完成,分片的状态将会变成active。
可以使用**_cat recovery API**来监控Split进程,或者可以使用集群健康API通过将**wait_for_status**参数设置为黄色来等待所有主分片分配完毕。
四、索引克隆
Elasticsearch Clone API可以用于Elasticsearch索引数据的复制和备份。
4.1、索引克隆
索引克隆不会克隆源索引的元数据,包括别名、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>
索引满足可以克隆的条件是:
源索引是只读的
整个集群的状态是green的。
处理索引拆分的节点必须有足够的空闲磁盘空间来容纳现有索引的第二个副本。
参照之前讲过的内容,仍然可以通过将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的值必须与源索引的主分片数量一致。
4.2、索引克隆的过程
创建一个具备和源索引定义一样的目标索引。
然后将源索引中的段(segment)硬链接到目标索引中。
目标索引进行Recover。
4.3、索引克隆的监控
使用Clone API进行索引的克隆,API正常返回并不意味着Clone的过程已经完成,这仅仅意味着创建目标索引的请求已经完成,并且加入了集群状态,此时主分片可能还未被分配,副本分片可能还未创建成功。
一旦主分片完成了分配,状态就会转化为initializing,并且开始进行克隆过程,直到克隆过程完成,分片的状态将会变成active。
可以使用**_cat recovery API**来监控Clone进程,或者可以使用集群健康API通过将**wait_for_status**参数设置为黄色来等待所有主分片分配完毕。
五、索引滚动
rollover API是Elasticsearch提供的一个很好用的功能。我们都知道在MySQL中一旦数据量比较大,可能会存在分库分表的情况,例如根据时间每个月一个表。rollover功能就类似这种情况,它的原理是先创建一个带别名的索引,然后设定一定的规则(例如满足一定的时间范围的条件),当满足该设定规则的时候,Elasticsearch会自动建立新的索引,别名也自动切换指向新的索引,这样相当于在物理层面自动建立了索引的分区功能,当查询数据落在特定时间内时,会到一个相对小的索引中查询,相对所有数据都存储在一个大索引的情况,可以有效提升查询效率。
rollover API会为data stream或者索引别名创建一个新的索引。(在Elasticsearch 7.9之前,一般使用索引别名的方式来管理时间序列数据,在Elasticsearch之后data stream取代了这个功能,它需要更少的维护,并自动与数据层集成)。
rollover API的效果依据待滚动的索引别名的情况不同而有不同的表现:
如果一个索引别名对应了多个索引,其中一个一定是写索引,rollover创建出新索引的时候会设置is_write_index为true,并且上一个被滚动的索引的is_write_index设置为false。
如果待滚动的索引别名对应的只有一个索引,那么在创建新的索引的同时,会删除原索引。
使用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_shards、master_timeout、timeout和dry_run,特别说一下dry_run,如果将dry_run设置为true,那么这次请求不会真的执行,但是会检查当前索引是否满足conditions指定的条件,这对于提前进行测试非常有用。
Request Body支持aliases、mappings和settings(这三个参数只支持索引,不支持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一个索引别名的一个案例:
创建一个索引并且设置为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 } }}'
请求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" }}'
如果别名的索引名称使用日期数学表达式,并且按定期间隔滚动索引,则可以使用日期数学表达式来缩小搜索范围。例如,下面的搜索目标是最近三天内创建的索引。
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"
六、索引冻结和解冻
索引的冻结是Elasticsearch提供的一个用于减少内存开销的操作,这个功能在7.14版本中被标记为Deprecated,在Version 8以后,已经对堆内存的使用进行了改进,冻结和解冻的功能不再适用。
这里简单的进行操作演示,如果是7.x版本仍然可以作为参照。
6.1、索引冻结
索引冻结API在Elasticsearch7.14版本被定义为Deprecated,在这个版本以后不建议使用。
索引冻结以后除了保存一些必要的元数据信息意外,将不再占用系统负载,索引将会变成只读,类似force merge等操作将无法执行。
API格式如下:
POST /my-index-000001/_freeze
6.2、索引解冻
API格式如下:
POST /<index>/_unfreeze
以下为索引解冻操作的代码案例:
curl -X POST "localhost:9200/my-index-000001/_unfreeze?pretty"
七、索引解析
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的作用多为辅助,实际使用不多,细节的参数可以参考官方的文档。
相关文章:
Elasticsearch索引全生命周期
索引(Index)是Elasticsearch中最重要的概念之一,也是整个Elasticsearch操作的基础,它是相互关联的文档的一个集合。在Elasticsearch种,数据存储为 JSON 文档,每个文档将一组键(字段或属性的名称)与其对应的…...
汇编指令学习(LOOP)
一、xor异或操作,相同为0,不同为1xor eax,eaxeax异或eax,相同为0,并把结果存放到eax,简单说该语句就是想eax寄存器清零。二、ECX,计数器mov ecx,0x3将ecx寄存器设置为3三、DEC减一操作dec ecxecx寄存器的值…...
Linux 配置本地yum源
挂载光盘 进入包 配置路径,查看在线yum源 移动在线yum源到/home/目录下 进入vi,任意取名以.repo结尾即可 按住i进行编辑,输入以下内容 注意gpgcheck1是检验,配置本地yum源不需要检验 写入上图内容按住:输入wq,点击回车…...
【PyTorch】教程:torch.nn.LeakyReLU
torch.nn.LeakyReLU 原型 CLASS torch.nn.LeakyReLU(negative_slope0.01, inplaceFalse) 参数 negative_slope (float) – 控制负值斜率,默认为 1e-2inplace (bool) – in-place 操作,默认为 False 定义 LeakyReLU(x)max(0,x)negative_slope∗min…...
【刷题】-- 基础 -- 二分查找
精于结构、敏于心智、熟于代码 方式:对于会的代码:学会以最快的速度构建,并以最快的速度书写;对于不会的代码:学会(以最短的路径下)看懂别人的代码。学会使用参考文档、熟悉每一个容器。 刷题位…...
Spark MLlib 特征工程
Spark MLlib 特征工程预处理特征选择归一化离散化Embedding向量计算特征工程制约了模型效果 : 决定了模型效果的上限 , 而模型调优只是在不停地逼近上限好的特征工程才能有好的模型 特征处理函数分类 : 预处理 : 将模型无法直接消费的数据,转为可消费的数据形式特…...
CentOS7 完全卸载 php
在 CentOS 7 使用 yum install 简单安装 php 后,发现 php 版本 5.4 ,太低了! 然后,使用 yum remove 简单卸载后,发现 php 还在,不干净! 只好 rpm 慢慢卸载 rpm -qa |grep php php-gd-5.4.16-4…...
关于OCS认证里必须知晓的内容
【关于OCS认证里必须知晓的内容】美国非营利组织Textile Exchange推出的有机认证标准——有机含量标准(The Organic Content Standard),简称OCS。该标准通过跟踪有机原材料的种植从而监管整个有机产业链。OCS将应用于各种有机种植原料的验证,而不只限于有…...
创业做电商难不难?新人做电商怎么才能挣钱?
这几年经济不景气,创业做电商的人越来越多,但是,对于多数人来说,一开始做电商,都是试错成本,没有系统学习或者是跟着半吊子二把刀学的,结果赔钱就算了,新人创业做电商到底难不难&…...
【项目设计】高并发内存池(七)[性能测试和提升]
🎇C学习历程:入门 博客主页:一起去看日落吗持续分享博主的C学习历程博主的能力有限,出现错误希望大家不吝赐教分享给大家一句我很喜欢的话: 也许你现在做的事情,暂时看不到成果,但不要忘记&…...
PHP:Laravel cast array json数据存数据库时unicode 编码问题和update更新不触发数据转换
目录问题描述问题解决方式一:自定义属性方式二:继承覆写方式三:trait复用方式四:定义Cast子类update不生效参考文章问题描述 Model示例 class UserModel extends Model {protected $table tb_user;protected $casts [alias …...
自动化测试总结--断言
采购对账测试业务流程中,其中一个测试步骤总是失败,原因是用例中参数写错及断言不明确 一、问题现象: 采购对账主流程中,其中一个步骤失败了,会导致这个套件一直失败 图(1)测试报告视图中&…...
传输线的物理基础(三):传输线的瞬时阻抗
每个信号都有一个上升时间 RT,通常是从 10% 到 90% 的电压电平测量的。当信号沿传输线向下移动时,前沿在传输线上展开并具有空间范围。如果我们可以冻结时间并观察电压分布向外移动时的大小,我们会发现类似下图的东西。传输线上上升时间的长度…...
第六章:多线程
第六章:多线程 6.1:程序、进程、线程基本概念 程序 程序program是为了完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码,静态对象。 进程 进程process是程序的一次执行过程,或是正在运行的一个程序。是一个…...
铁路与公路
蓝桥杯集训每日一题acwing4074 某国家有 n 个城市(编号 1∼n)和 m 条双向铁路。 每条铁路连接两个不同的城市,没有两条铁路连接同一对城市。 除了铁路以外,该国家还有公路。 对于每对不同的城市 x,y,当且仅当它们之…...
GitHub Copilot 全新升级,工作效率提升 55%
2021年 6 月,GitHub 和 OpenAI 推出了 GitHub Copilot 预览版,可根据命名或者正在编辑的代码上下文为开发者提供代码建议,被称为“你的 AI 结对程序员”。 近日,GitHub 宣布,经过去年 12 月以来的短暂测试后ÿ…...
【IoT】《天道》中音响案例的SWOT分析
在20世纪80年代初,SWOT最初是由美国知名管理学教授海因茨韦里克提出的。 之后这个工具就经常被用于企业的战略分析、竞争对手分析等场景。 在每年例行的公司产品规划过程中,我个人也经常使用这个工具。 由于涉及一些公司商业上的信息,下面会用…...
如何实现接口幂等性
1 什么是幂等 幂等操作的特点是一次或者任意多次执行所产生的影响均与一次执行的影响相同,不会因为多次的请求而产生不一样的结果。换句话说,就是我使用相同的请求参数,去请求同一个接口,不管请求多少次获取到的响应数据应该是一…...
相恨见晚的office办公神器(不坑盒子/打工人Excel插件2023年最新版)
不坑盒子 这是一个非常好用的插件工具,专门应用在Word文档和wps,支持Office 2010以上的版本,操作也简单且实用。 不坑盒子下载及使用说明 一键排版功能 像是下面的自动排版功能,可以在配置里面先设定好需要的格式,…...
matlab基础到实战(1)
目录概述sin函数例子四则运算实数复数逻辑运算复数运算模幅角共轭向量二维向量定义序列生成向量向量索引方式加减乘除向量间运算加减乘法除法概述 MATLAB是美国MathWorks公司出品的商业数学软件,用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理…...
谷歌发布编写分布式应用的框架Service Weaver
一个新的框架,在本地以模块化单体的形式运行,一旦部署,则为分布式微服务架构 转载请注明来源:https://janrs.com/2023/03/%e8%b0%b7%e6%ad%8c%e5%8f%91%e5%b8%83%e7%bc%96%e5%86%99%e5%88%86%e5%b8%83%e5%bc%8f%e5%ba%94%e7%94%a8…...
详解FPGA:人工智能时代的驱动引擎观后感
详解FPGA:人工智能时代的驱动引擎观后感 本书大目录 第一章 延续摩尔定律 第二章 拥抱大数据的洪流 第三章 FPGA在人工智能时代的独特优势 第四章 更简单也更复杂——FPGA开发的新方法 第五章 站在巨人肩上——FPGA发展新趋势 文章目录详解FPGA:人工智能…...
Rest/Restful接口
Rest Rest的全称是Representational State Transfer 。Rest是一种架构风格。Rest有很多原则和限制: 客户端-服务端架构模式无状态可缓存统一接口分层系统按需缓存 Rest对我们开发人员来说基本上就是资源,我们一般通过URI表示我们请求的一个资源。例如:…...
【vue init】三.项目引入axios、申明全局变量、设置跨域
教程目录 一:《【vue init】使用vue init搭建vue项目》 二:《【vue init】项目使用vue-router,引入ant-design-vue的UI框架,引入less》 三:《【vue init】项目引入axios、申明全局变量、设置跨域》 根据前文《【vue init】项目使…...
搭建nextcloud私有云盘
要搭建Nextcloud,需要在服务器上安装和配置Nginx、PHP和SQLite3。下面是一些基本步骤: 安装Nginx 可以使用包管理器进行安装。例如,在Ubuntu上可以运行以下命令: sudo apt update sudo apt install nginx配置Nginxwget -P /home/u…...
05 | 如何安全、快速地接入OAuth 2.0?
05 | 如何安全、快速地接入OAuth 2.0? 构建第三方软件应用 第一点,注册信息 小兔软件的研发人员提前登录到京东商家开放平台进行手动注册,以便后续使用这些注册的相关信息来请求访问令牌。兔软件需要先拥有自己的 app_id 和 app_serect 等信…...
nest.js学习笔记(一)
nest.js学习笔记(一)一、安装nest.js前置条件运行项目目录介绍二、nest.js cli 常用命令三、RESTful 风格设计1.接口url2.RESTful 版本控制四、获取前端传过来的参数1.获取Get请求参数2.获取Post请求参数3.动态路由4.获取Header信息5.自定义状态码nest.j…...
win下载配置CIC Flowmeter环境并提取流量特征
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、下载CIC Flowmeter二、安装java、maven、gradle和IDEA1.java 1.82.maven3.gradle4.IDEA三、CICFlowMeter-master使用四、流量特征1.含义2.获取前言 配了一整…...
【LeetCode刷题-Java/Python】二分查找
二分查找704.二分查找题目实现总结35.搜索插入位置题目实现34. 在排序数组中查找元素的第一个和最后一个位置题目实现69.x的平方根题目实现367. 有效的完全平方数题目实现704.二分查找 题目 题目链接 给定一个 n 个元素有序的(升序)整型数组 nums 和一…...
Linux 6.2 已正式发布
Linus Torvalds 发布了稳定的 Linux 6.2 内核,这是 2023 年的第一个主要内核版本。硬件方面,Linux 6.2 提升了 Intel Arc 显卡 (DG2/Alchemist) 的稳定性,真正做到开箱即用。英特尔的 On Demand 驱动程序现在状态良好,适用于第 4 …...
网站怎么做能提升ip流量/网络推广平台有哪些
废话篇那晚,我和FeignClient注解的深度交流了一次,爽!主要还是在技术群里看到有同学在问相关问题,比如: contextId是干嘛的?name相同的多个Client会报错?然后觉得有必要写篇文章聊聊FeignClient的使用&…...
开展建设文明网站活动方案/可以免费投放广告的平台
for Text1 in cat uniq1 dofor Text2 in cat uniq2doif [ "$Text1" "$Text2" ]thenecho $Text1 >> thesamefidone done...
政府单位网站建设改版方案/西安 做网站
golang 模板(template)的常用基本语法 模板 在写动态页面的网站的时候,我们常常将不变的部分提出成为模板,可变部分通过后端程序的渲染来生成动态网页,golang提供了html/template包来支持模板渲染。 这篇文章不讨论golang后端的模板读取及渲染…...
崇州市微信端网站建/怎样下载优化大师
excel如何读取B列的数据类型和b列里的数据sum(b:b,"工具",a:a)EXCEL如何将表格的数据类型分类提取出来(提取筛选的数据类型)把C列的数据复制,到右边找一列空的列,粘贴进去。然后选中右边粘贴过来的这列、点顶部的:数据---删除重复项…...
ASP.NET网站建设实战/百度手机应用市场
锁在日常的开发过程中,为了控制线程的并发肯定会用到锁机制。对于数据库而言,锁机制就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则。当然MySQL也不例外,根据不同的存储引擎,M…...
罗岗网站建设公司/网站收录服务
首先,要分别在两个文件中实现以下两个类 class Object { public: NewType ToType(); }; class NewType : public Object { } -------------------------------------------------------------------------------- 做法1 -------------------------------------------------…...