elasticsearch index API操作详解

2023-11-09 16:24:29 浏览数 (3)

一.Create index(创建索引)

1.创建空索引

代码语言:javascript复制
#此时的索引setting参数读取默认模板进行适配,且不包含任何mapping字段
PUT /my-index-000001

2.创建索引并设置索引参数

代码语言:javascript复制
#在该创建语句中我们创建索引并在settings中设置索引的主分片数与副本分片数。如果我们需要设置其他参数也同意添加至settings中。
PUT /my-index-000001
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 2
  }
}

3.创建索引并制定字段类型

代码语言:javascript复制
#在该创建语句中,我们指定了索引的主分片数,并设置了mapping字段类型。将field1字段设置为text类型。如果需要添加其他字段则同意添加至mapping部分中。
PUT /test
{
  "settings": {
    "number_of_shards": 1
  },
  "mappings": {
    "properties": {
      "field1": { "type": "text" }
    }
  }
}

需要值的注意的是:在elasticsearch7.x版本之后,已经默认不在支持_type。而是一个index存储一份独立的数据。类似于库表合一的概念。

elasticsearch版本

是否支持_type

备注

5.x

支持

支持一个索引中配置多个_type

6.8.x

支持

支持一个索引中仅配置一个_type

7.x

不支持

留了通过"include_type_name"参数支持在索引中配置一个_type

8.x

不支持

不在通过参数支持配置_type

4.Aliases(别名)

代码语言:javascript复制
#创建名为test的索引,并为索引制定一个别名
PUT /test
{
  "aliases": {
    "alias_1": {},
    "alias_2": {
      "filter": {
        "term": { "user.id": "kimchy" }
      },
      "routing": "shard-1"
    }
  }
}
#此外别名还支持动态按天,按月这类方式自动生成
PUT /logs
{
  "aliases": {
    "<logs_{now/M}>": {}
  }
}

别名的应用场景:

例如业务系统通过统一的名称对索引进行写入。而索引存储设计上又需要将数据划分为多个索引,例如按天生成索引进行写入。此时我们就可以通过别名对索引进行写入。别名每天作用于新建的索引上。每天的数据只对当天的索引进行写入。

二.Delete index(删除索引)

代码语言:javascript复制
DELETE /my-index-000001

顾名思义,删除索引是直接将索引在集群中删除。这种方式可以直接释放磁盘空间,降低集群负载。

当集群中有大量索引时,我们通过DELETE api一个一个删除索引过于麻烦,是否有更加便捷的方法呢?

代码语言:javascript复制
DELETE /test-*

我们可以通过通配符的方式对不再使用的索引进行快速删除。

如果集群没有打开通过通配符匹配索引,我们还需要将一下参数值设置为true。该参数默认值为false。

代码语言:javascript复制
action.destructive_requires_name = true

三.Get index(获取集群信息)

代码语言:javascript复制
GET /my-index-000001

通过该API,我们能够获取到索引的详细内容,包含settings中的当前索引的全部参数以及mappings中的全部字段映射。

应用场景分析

在我们创建索引时,没有指定索引mapping,然后对索引进行数据写入。发现elasticsearch会对索引自动进行mapping的生成。(这是由于elasticsearch具备字段类型推测的能力,能够根据传入的数据值,自动推断出相应字段的字段类型,进而在索引中创建相应的mapping。)

例如:当我们对索引中某个字段做match查询时,发现没有数据返回,然而我们传入的数据却是符合要求的字符串。此时我们就需要排查相应字段的类型。通过GET /index 来分析具体的字段类型,排查问题原因。一般都是由于自动推断时将字段类型推断为了keyword。导致我们无法对该字段进行match查询。

四.Exists(检测索引是否存在)

代码语言:javascript复制
HEAD my-data-stream

一般我们用该API检测当前集群中是否存在特定名称的索引(index),数据流(data_stream),别名(aliases)等。

该API的功能类似于我们在关系型数据库中创建数据库或数据表时对于库名或表名的判断;使用IF NOT EXISTS database_name;对数据库是否存在进行判断。

五.Close index(关闭索引)

代码语言:javascript复制
POST /my-index-000001/_close

我们可以使用该API关闭掉索引,只是将索引进行关闭,关闭后索引将不在读写。但索引中的数据仍保留在集群中。

应用场景分析:

当我们在某个时间对于部分业务索引暂时不使用,又想保留该索引的数据,以便日后使用,我们就可以使用_close API。后续业务需要查询该索引时,我们就可以重新把索引进行打开。当索引关闭后elasticsearch集群将不在维护该索引的数据结构。缓存在内存中的该索引的元数据信息也会被释放。在一定程度上可以降低集群性能的开销。

六.Open index(打开索引)

代码语言:javascript复制
POST /my-index-000001/_open

有_close索引与之对应就会有_open索引。当我们需要启用之前被关闭的索引时,我们就可以通过_open API打开索引。

注意:当我们打开索引时,需要提前评估集群当前的负载,是否能够支撑索引打开后的资源需求,因为当索引打开后集群会重新维护这些被打开索引的数据结构。会增大集群的开销。

七.Shrink index(收缩索引)

代码语言:javascript复制
POST /my-index-000001/_shrink/shrunk-my-index-000001

用途

该API主要用于收缩索引,例如my-index-000001索引有8个主分片,我们通过_shrink API 可以将my-index-000001

收缩为4个主分片,索引名为shrunk-my-index-000001。

应用场景分析

日志场景:我们需要对当天大量写入的日志索引配置较多的主分片,以提高写入性能。次日,前一天的日志索引已经不再有数据写入,我们就可以通过收缩索引,对前一日的索引进行收缩,降低历史日志索引的主分片数,从而降低集群整体的主分片数,从而降低集群整体负载。便于集群将更多的资源应用在大量读写的索引中。

操作注意事项

  1. shrink后的目的索引的索引名必须是不存在的。
  2. 源索引的主分片数必须大于shrink后索引的主分片数(shrink的主要目的是收缩索引,降低索引主分片数。)
  3. shrink前后,源索引与目的索引的分片的文档数不能超过2,147,483,519上限。(因为elasticsearch对于单个分片的文档数有限制,因为int类型的上限是21亿)。所以在shrink操作之前需要评估shrink后的分片数是否能够承载当前索引的数据。
  4. shrink操作前,需要评估集群有足够的空间来容纳shrink操作过程中产生的索引的数据量,直至shrink完成。
  5. 在shrink操作之前,源索引必须只读或者不会再有数据进行写入,方可对源索引进行shrink操作。

八.Split index(切分索引)

代码语言:javascript复制
POST /my-index-000001/_split/split-my-index-000001
{
  "settings": {
    "index.number_of_shards": 2
  }
}

通过该API,我们可以将源索引切分出更多的主分片。

应用场景分析

当某个索引前期分片设计不合理,索引中存在大分片,造成读写速度慢,集群资源利用不充分,分片初始化,搬迁时间长等问题。导致无法满足业务需求。则可以通过切分索引的方式将索引的主分片数增多,便于后续分片分布到更多的数据节点中,以满足业务的读写需求。

操作注意事项

  1. Split后目的索引的索引名必须是不存在的。
  2. 源索引的主分片数必须小于Split后目的索引的主分片数。
  3. Split后目的索引的主分片数必须是源索引的主分片数的倍数。
  4. 在对索引进行Split操作前,需要评估集群有足够的空间来容纳Split操作过程中产生的索引的数据量。以保证Split操作顺利完成。
  5. 为了确保Split前后索引数据一致,我们还需要再Split操作之前,将源索引的状态置为只读的状态。

九.Clone index(克隆索引)

代码语言:javascript复制
POST /my-index-000001/_clone/cloned-my-index-000001

通过该API,我们可以快速复制出基于源索引的全部参数配置与mapping信息的新索引。同时数据也会被克隆至新索引中。这个操作类似于我们在数据库中拷贝表的操作。

注意事项

  1. 克隆操作后的目的索引的索引名必须是不存在的。
  2. 克隆操作前后的源索引与目的索引的主分片数必须一致。
  3. 在对索引进行clone操作前,需要评估集群有足够的空间来容纳Split操作过程中产生的索引的数据量。以保证clone操作顺利完成。

十.Rollover(滚动索引)

代码语言:javascript复制
POST my-data-stream/_rollover

通过该API,我们可以对索引进行滚动。一般需要与ILM(索引生命周期策略)结合使用;

应用场景

通过对索引进行rollover操作,可以让索引根据数据量大小,分片体积大小,时间等进行动态滚动。能够有效的控制每一个索引的数据总量,同时结合ILM,实现自动对索引进行滚动创建,降冷,收缩,删除等操作。降低了elasticsearch使用人员的工作量。保障业务稳定运行与集群稳定运行。

十一.Freeze index (冻结索引)

代码语言:javascript复制
POST /<index>/_freeze

使用该API,我们可以对索引进行冻结操作。索引冻结后,仅用于查询,将不会在进行数据写入以及索引内部的段合并。

应用场景

  1. 对于低频查询但需要保留数据的索引,我们可以对索引进行冻结操作,一定程度上节省存储空间。
  2. 在大型elasticsearch集群中,对于数据量较大且使用频率较低的索引可以使用冻结操作,可以减少集群资源的使用,降低集群的负载。
  3. 冻结索引可以作为一种数据备份的方式,通过索引冻结方式索引数据被意外修改或删除。

十二.Unfreeze index(解冻索引)

代码语言:javascript复制
POST /<index>/_unfreeze

使用该API我们可以对索引进行解冻操作。当我们需要对冻结索引恢复读写或进行其他操作时,我们就需要对索引进行解冻。需要注意的是在解冻前我们需要评估当前集群的资源是否能够承载索引解冻后的资源消耗

十三.Resolve index(解析索引)

代码语言:javascript复制
GET /_resolve/index/<name>

通过该API我们可以对索引进行解析,以获取索引相应的元数据信息。返回示例如下:

代码语言:javascript复制
{
  "indices": [                                 
    {
      "name": "foo_closed",
      "attributes": [
        "closed"
      ]
    },
    {
      "name": "freeze-index",
      "aliases": [
        "f-alias"
      ],
      "attributes": [
        "frozen",
        "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"
    }
  ]
}

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

0 人点赞