Elasticsearch

將項目模板應用於elasticsearch

  • June 1, 2017

我正在嘗試將項目模板應用於我的 elasticsearch 集群,以處理內容超過 32kb 的欄位的問題。我使用的是 2.4.4 版本,因為這是 graylog 中支持的最高版本。

見:https ://github.com/Graylog2/graylog2-server/issues/873

具體解決方案在這裡:https ://github.com/Graylog2/graylog2-server/issues/873#issuecomment-199898314

我還遇到了另一個我試圖用項目模板修復的問題。其中一個欄位可以包含數字或字元串。但是因為elasticsearch根據其中第一次出現的值來映射欄位,它有時會在活動索引上給我一個MapperParsingException。

根據連結的 github 問題中建議的解決方案,我製作了自己的項目模板,並在 elasticsearch 文件的支持下添加了一個動態模板。

這是結果:

{
   "template": "graylog*",
   "mappings": {
       "_default_": {
           "_all": {
               "enabled": false
           },
           "dynamic_templates": [{
               "entityid_as_string": {
                   "match": "EntityId",
                   "mapping": {
                       "type": "string"
                   }
               }
           },
           {
               "notanalyzed_string": {
                   "match_mapping_type": "string",
                   "mapping": {
                       "ignore_above": 32766,
                       "type": "string",
                       "doc_values": true
                   }
               }
           }]
       }
   }
}

我期望的行為是欄位 EntityId 將始終映射為字元串。並且文件中任何內容超過 32kb 的字元串欄位都不會被索引。

但情況似乎並非如此。即使在手動旋轉活動寫入索引之後,我仍然會遇到相同的錯誤。我什至重新啟動了 VM,並旋轉了活動寫入索引 - 沒有任何效果。

任何人都可以看到我的模板有明顯的錯誤嗎?具體來說,我不確定 _all 部分是否應該在那裡。

我用這個命令來添加它:

curl -XPUT 'localhost:9200/_template/loggingtemplate?pretty' -H 'Content-Type: application/json' -d'<template here'

並且這個命令用來驗證它是否已經被添加。

curl -XGET localhost:9200/_template/loggingtemplate

由於某種原因,我的動態映射沒有得到尊重。

相反,為了解決這個問題,我必須為我的所有索引集創建一個自定義索引映射。在我看來,這是一個骯髒的解決方案,因為我現在必須複製粘貼所有索引集的配置。忘記一個將導致索引錯誤和消息失去 - 以防我們的日誌消息的結構在未來發生變化。

詳細資訊在這裡: http ://docs.graylog.org/en/2.2/pages/configuration/elasticsearch.html#custom-index-mappings

這是我為我們的索引集創建的映射。在具體範例中,我將其應用於名為“application_logs”的索引集。

{
   "template": "application_logs_*",
   "mappings": {
       "message": {
           "properties": {
               "Message": {
                   "type": "string",
                   "ignore_above": 32766
               },
               "EventEntities": {
                   "type": "string",
                   "ignore_above": 32766
               },
               "Severity": {
                   "type": "string"
               },
               "EntityId": {
                   "type": "string"
               }
           }
       }
   }
}

要將其添加到 elasticsearch,我將使用以下命令。

curl -XPUT 'localhost:9200/_template/logs_fields_as_strings?pretty' -H 'Content-Type: application/json' -d'{"template": "application_logs_*","mappings" : {"message" : {"properties" : {"Message" : {"type" : "string","ignore_above" : 32766},"EventEntities" : {"type" : "string","ignore_above": 32766},"Severity" : {"type" : "string"},"EntityId" : {"type" : "string"}}}}}'

這將創建一個名為“logs_fields_as_strings”的模板。

對於我們擁有的每個索引集,我需要修改模板名稱和模板的目標。

數字 32766 是要索引的欄位可以包含的最大字節數。請記住,一些 UTF8 字元是 3 個字節。因此,如果您希望在消息中包含這些,則需要將 32766 除以 3,以確保不會失去任何消息。

引用自:https://serverfault.com/questions/851796