2017-08-03 102 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

相關問題