2017-08-03 66 views
0

我在单个节点上运行一个小型ELK 5.4.0堆栈服务器。当我开始时,我只是采取了所有的默认设置,这意味着每个索引有5个分片。我不希望所有这些碎片的开销,所以我创建的索引模板,像这样:Elasticsearch索引模板丢失原始字符串映射

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散列保存有关创建“原始”字段的信息。

我的猜测是,我需要添加到更新我的索引模板

PUT /_template/logstash 
{ 
    "template": "logstash*", 
    "settings": { 
    "number_of_shards": 1, 
    "number_of_replicas": 0 
    }, 
    "mappings": { 
    "logs": { 
     "_all": {...}, 
     "dynamic_templates": {...}, 
    }, 
    "_default_": { 
     "_all": {...}, 
     "dynamic_templates": {...}, 
     "properties": {...} 
    } 
} 

督察,一切,但logs.properties(持有领域的logstash发送过当前的列表)。

但我不是ES专家,现在我有点担心。我原来的索引模板没有按照我认为的方式工作。我的上述计划是否有效?或者我会让事情变得更糟?当您创建索引模板时,您是否总是包含的一切?在我有模板文件之前,旧版索引的映射来自哪里?

回答

1

当Logstash第一次启动时,elasticsearch输出插件安装its own index template_default_模板和dynamic_templates为你正确地想通了。

每次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模板和模板中的分片设置的映射。

+0

感谢您的明确解释!在不明确的情况下添加一个注释:“.raw”字段现在已更改为“.keyword”字段。但一切都按照你的预测工作! –

+0

真棒,很高兴它帮助! – Val

相关问题