我在一个节点上运行一个小型的ELK 5.4.0堆栈服务器。当我开始时,我只采用了所有默认值,这意味着每个索引有5个分片。我不想要所有这些分片的开销,所以我创建了一个像这样的索引模板:
PUT /_template/logstash
{
"template": "logstash*",
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0
}
}
这很好用,但我刚刚意识到ES中现在缺少所有原始字段。例如," uri"是我的索引字段之一,我曾经得到过" uri.raw"作为一个未经分析的版本。但是自从我更新模板后,它们就丢失了。查看当前模板显示
GET /_template/logstash
Returns:
{
"logstash": {
"order": 0,
"template": "logstash*",
"settings": {
"index": {
"number_of_shards": "1",
"number_of_replicas": "0"
}
},
"mappings": {},
"aliases": {}
}
}
似乎映射已经丢失了。我可以从早期的索引中拉出映射
GET /logstash-2017.03.01
并将其与最近的
进行比较GET /logstash-2017.08.01
我在三月看到有一个像
这样的映射结构mappings: {
"logs": {
"_all": {...},
"dynamic_templates": {...},
"properties": {...}
},
"_default_": {
"_all": {...},
"dynamic_templates": {...},
"properties": {...}
}
}
现在我只有
mappings: {
"logs": {
"properties": {...}
}
}
dynamic_templates哈希包含有关创建" raw"的信息。字段。
我的猜测是我需要添加以将我的索引模板更新为
PUT /_template/logstash
{
"template": "logstash*",
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0
},
"mappings": {
"logs": {
"_all": {...},
"dynamic_templates": {...},
},
"_default_": {
"_all": {...},
"dynamic_templates": {...},
"properties": {...}
}
}
IOW,除logs.properties
之外的所有内容(其中包含当前由logstash发送的字段列表)。
但我不是ES专家,现在我有点担心。我原来的索引模板并没有像我想象的那样成功。我的上述计划是否有效?或者我会让事情变得更糟?创建索引模板时,您是否必须始终包含所有内容?在我有模板文件之前,旧索引的映射来自哪里?
答案 0 :(得分:1)
当Logstash首次启动时,elasticsearch
输出插件会使用_default_
模板和dynamic_templates
安装its own index template,正如您所知。
每当Logstash创建一个新的logstash-*
索引(即每天)时,都会利用模板,并使用模板中存在的正确映射创建索引。
您现在需要做的只是采用已覆盖的官方logstash模板并重新安装(例如使用修改后的分片设置):
PUT /_template/logstash
{
"template" : "logstash-*",
"version" : 50001,
"settings" : {
"index.refresh_interval" : "5s"
"index.number_of_shards": 1,
"index.number_of_replicas": 0
},
"mappings" : {
"_default_" : {
"_all" : {"enabled" : true, "norms" : false},
"dynamic_templates" : [ {
"message_field" : {
"path_match" : "message",
"match_mapping_type" : "string",
"mapping" : {
"type" : "text",
"norms" : false
}
}
}, {
"string_fields" : {
"match" : "*",
"match_mapping_type" : "string",
"mapping" : {
"type" : "text", "norms" : false,
"fields" : {
"keyword" : { "type": "keyword", "ignore_above": 256 }
}
}
}
} ],
"properties" : {
"@timestamp": { "type": "date", "include_in_all": false },
"@version": { "type": "keyword", "include_in_all": false },
"geoip" : {
"dynamic": true,
"properties" : {
"ip": { "type": "ip" },
"location" : { "type" : "geo_point" },
"latitude" : { "type" : "half_float" },
"longitude" : { "type" : "half_float" }
}
}
}
}
}
}
你可以做到的另一种方法是不覆盖logstash
模板,但使用任何其他id,例如_template/my_logstash
,这样在索引创建时,两个模板都会被踢进去使用了官方logstash模板中的映射和模板中的分片设置。