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

8

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

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

但是,我仍然不理解它们之间的区别。当定义索引“模式”时,它不会影响索引的创建吗?那么如果我创建一个没有相应索引模式的索引会发生什么?如何查看用于索引模式的映射,以便了解如何使用Mapping API进行更新?

另外一件事,文档中说,您可以通过单击“设置”,然后单击“索引”选项卡来管理索引模式。但我在Kibana上看不到任何设置选项卡。我可以通过管理选项卡查看索引模式,但我在那里看不到任何设置选项卡。

1个回答

14

一个索引模板是ES的一个功能,当匹配名称模式时触发创建新索引。例如,假设我们创建了以下索引模板:

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

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

您只需像上面那样简单地PUT新的设置/映射定义即可随时更新索引模板。

索引模式(不要与您在上面看到的index-patterns属性混淆,这是两个完全不同的事物)是Kibana的一个功能,用于告诉Kibana一个索引由什么组成(所有字段、它们的类型等)。在Kibana中没有创建索引模式就什么都做不了,您可以在管理>索引模式中进行操作。

在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还存储时间戳字段,索引模式的名称(可以跨越多个索引),同时为您定义的每个字段存储各种属性,例如对于名称字段,索引模式包含了Kibana需要知道的以下信息:

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

1
为什么Kibana需要索引模式?它不能直接读取索引并显示吗? - CodeMonkey
当我问索引模式是否影响索引创建时,我的意思是您是否可以将其用作模板,因为它们还对应着名称模式? - CodeMonkey
1
请查看我的更新答案。基本上,索引模板和索引模式是两个不同的实体,前者允许创建一个索引,而后者可以跨越多个索引。 - Val
我们仍然没有解决这个问题——Kibana如何应用映射?它是否考虑索引映射,还是只考虑索引模式映射?索引映射与Kibana索引模式映射的优先级规则是什么?映射是在查询时间还是显示时间应用的?简而言之,这两种映射之间的关系是什么? - Banoona
@Banoona,Kibana索引模式中可用的字段是由索引模式名称所识别的所有底层索引映射的合取 - Val

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接