ElasticSearch - 索引模板和索引模式有什么区别

ElasticSearch - what is the difference between an index template and an index pattern

我在这里阅读了对我的问题的解释:

https://discuss.elastic.co/t/whats-the-differece-between-index-pattern-and-index-template/54948

但是,我还是不明白其中的区别。在定义一个索引PATTERN的时候,是不是一点都不影响索引的创建呢?另外,如果我创建了一个索引但它没有相应的索引模式会怎样?如何查看用于索引模式的映射,以便知道如何使用映射 API 更新它?

附带说明一下,文档说您可以通过单击 "Settings" 然后单击 "Indices" 选项卡来管理索引模式。我正在查看 Kibana,但没有看到任何设置选项卡。我可以通过管理选项卡查看索引模式,但我在那里看不到任何设置选项卡

index template 是一个 ES 特性,用于在匹配名称模式时触发新索引的创建。例如,假设我们创建了以下索引模板:

PUT _template/template_1
{
  "index_patterns": ["foo*"],
  "settings": {
    "number_of_shards": 1
  },
  "mappings": {
    ...
  }
}

如您所见,一旦我们想要在名为(例如)foo-44 的索引中索引文档并且该索引不存在,那么将使用该模板(设置+映射)通过 ES 自动创建 foo-44 索引。

您可以随时更新索引模板,只需像上面那样简单地输入一个新的 settings/mappings 定义即可。

一个 index pattern(不要与您在上面看到的 index-patterns 属性 混淆,它们是两个完全不同的东西),是一个 Kibana 功能,用于告诉 Kibana 什么构成索引(所有字段、它们的类型等)。如果不创建索引模式,Kibana 将一事无成,您可以在 Management > Index Patterns.

中创建索引模式

在 ES 中创建索引不会在 Kibana 中创建任何索引模式。同样,在 Kibana 中创建索引模式不会在 ES 中创建任何索引。

Kibana 需要索引模式的原因是因为它需要存储与索引映射中可用的不同类型的信息。例如,假设您使用以下映射创建索引:

PUT my_index
{
  "mappings": {
    "doc": {
      "properties": {
        "timestamp": {
          "type": "date"
        },
        "name": {
          "type": "text"
        }
      }
    }
  }
}

那么你在Kibana中创建的对应索引模式会有以下内容:

GET .kibana/doc/index-pattern:16a98050-a53f-11e8-82ab-af0d48c6ddd8
{
  "type": "index-pattern",
  "updated_at": "2018-08-21T12:38:22.509Z",
  "index-pattern": {
    "title": "my_index*",
    "timeFieldName": "timestamp",
    "fields": """[{"name":"_id","type":"string","count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":false},{"name":"_index","type":"string","count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":false},{"name":"_score","type":"number","count":0,"scripted":false,"searchable":false,"aggregatable":false,"readFromDocValues":false},{"name":"_source","type":"_source","count":0,"scripted":false,"searchable":false,"aggregatable":false,"readFromDocValues":false},{"name":"_type","type":"string","count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":false},{"name":"name","type":"string","count":0,"scripted":false,"searchable":true,"aggregatable":false,"readFromDocValues":false},{"name":"timestamp","type":"date","count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true}]"""
  }
}

如您所见,Kibana 还存储了时间戳字段,即索引模式的名称(可以跨越多个索引)。它还为您定义的每个字段存储各种属性,例如,对于 name 字段,索引模式包含 Kibana 需要知道的以下信息:

  {
    "name": "name",
    "type": "string",
    "count": 0,
    "scripted": false,
    "searchable": true,
    "aggregatable": false,
    "readFromDocValues": false
  },