创建一个索引

我们已经通过索引一篇文档创建了一个新的索引 。
这个索引采用的是默认的配置,新的字段通过动态映射的方式被添加到类型映射。

索引模板

Elasticsearch 不要求你在使用一个索引前创建它。 对于日志记录类应用,依赖于自动创建索引比手动创建要更加方便。

Logstash 使用事件中的时间戳来生成索引名。
默认每天被索引至不同的索引中,因此一个 @timestamp 为 2014-10-01 00:00:01 的事件将被发送至索引 logstash-2014.10.01 中。
如果那个索引不存在,它将被自动创建。

通常我们想要控制一些新建索引的设置(settings)和映射(mappings)。
也许我们想要限制分片数为 1 ,并且禁用 _all 域。
索引模板可以用于控制何种设置(settings)应当被应用于新创建的索引:

PUT /_template/my_logs       #创建一个名为 my_logs 的模板。
{
  "template": "logstash-*",  #将这个模板应用于所有以 logstash- 为起始的索引。
  "order":    1,             #这个模板将会覆盖默认的 logstash 模板,因为默认模板的 order 更低。
  "settings": {
    "number_of_shards": 1    # 限制主分片数量为 1 。
  },
  "mappings": {
    "_default_": { 
      "_all": {                # 为所有类型禁用 _all 域。
        "enabled": false
      }
    }
  },
  "aliases": {
    "last_3_months": {}     # 添加这个索引至 last_3_months 别名中。
  }
}

这个模板指定了所有名字以 logstash- 为起始的索引的默认设置,不论它是手动还是自动创建的。 如果我们认为明天的索引需要比今天更大的容量,我们可以更新这个索引以使用更多的分片。

这个模板还将新建索引添加至了 last_3_months 别名中,然而从那个别名中删除旧的索引则需要手动执行。

删除索引

删除指定的索引
DELETE /my_index

删除多个索引
DELETE /index_one,index_two
DELETE /index_*

DELETE /_all
DELETE /*
能够用单个命令来删除所有数据可能会导致可怕的后果。
如果你想要避免意外的大量删除,
你可以在你的 elasticsearch.yml 做如下配置: action.destructive_requires_name: true

索引设置

最重要的两个设置

  • number_of_shards
    每个索引的主分片数,默认值是 5 。这个配置在索引创建后不能修改。
  • number_of_replicas
    每个主分片的副本数,默认值是 1 。对于活动的索引库,这个配置可以随时修改。

我们可以创建只有 一个主分片,没有副本的小索引

PUT /my_temp_index
{
    "settings": {
        "number_of_shards" :   1,
        "number_of_replicas" : 0
    }
}

我们可以用 update-index-settings API 动态修改副本数

PUT /my_temp_index/_settings
{
    "number_of_replicas": 1
}

类型和映射

类型 在 Elasticsearch 中表示一类相似的文档。
类型由 名称 —比如 user 或 blogpost —和 映射 组成。

映射, 就像数据库中的 schema ,描述了文档可能具有的字段或 属性 、
每个字段的数据类型—比如 string, integer 或 date —以及Lucene是如何索引和存储这些字段的。

类型的实现

Elasticsearch 类型是 以 Lucene 处理文档的这个方式为基础来实现的。
一个索引可以有多个类型,这些类型的文档可以存储在相同的索引中。

Lucene 没有文档类型的概念,每个文档的类型名被存储在一个叫 _type 的元数据字段上。 当我们要检索某个类型的文档时,
Elasticsearch 通过在 _type 字段上使用过滤器限制只返回这个类型的文档。

Lucene 也没有映射的概念。 映射是 Elasticsearch 将复杂 JSON 文档 映射 成 Lucene 需要的扁平化数据的方式。

例如,在 user 类型中, name 字段的映射可以声明这个字段是 string 类型,并且它的值被索引到名叫 name 的倒排索引之前,需要通过 whitespace 分词器分析:

索引别名和零停机

有两种方式管理别名: _alias 用于单个操作, _aliases 用于执行多个原子级操作。

我们假设你的应用有一个叫 my_index 的索引。事实上, my_index 是一个指向当前真实索引的别名。真实索引包含一个版本号: my_index_v1 , my_index_v2 等等

PUT /my_index_v1 
PUT /my_index_v1/_alias/my_index 

查询索引别名指向的索引

GET /*/_alias/my_index

哪些别名指向这个索引

GET /my_index_v1/_alias/*

一个别名可以指向多个索引,所以我们在添加别名到新索引的同时必须从旧的索引中删除它。这个操作需要原子化,这意味着我们需要使用 _aliases 操作:

POST /_aliases
{
    "actions": [
        { "remove": { "index": "my_index_v1", "alias": "my_index" }},
        { "add":    { "index": "my_index_v2", "alias": "my_index" }}
    ]
}

kyle
23 声望4 粉丝