Elasticsearch Index模板丢失了原始字符串映射

时间:2017-08-03 22:21:05

标签: elasticsearch elastic-stack

我在一个节点上运行一个小型的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专家,现在我有点担心。我原来的索引模板并没有像我想象的那样成功。我的上述计划是否有效?或者我会让事情变得更糟?创建索引模板时,您是否必须始终包含所有内容?在我有模板文件之前,旧索引的映射来自哪里?

1 个答案:

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