# 映射改变

原文链接 : [https://www.elastic.co/guide/en/elasticsearch/reference/5.0/breaking_50_mapping_changes.html](https://www.elastic.co/guide/en/elasticsearch/reference/5.0/breaking_50_mapping_changes.html)

译文链接 : [http://www.apache.wiki/pages/viewpage.action?pageId=4260763](http://www.apache.wiki/pages/viewpage.action?pageId=4260763)

贡献者 : [片刻](/display/~jiangzhonglian)

## string字段替换为text / keyword 字段

string字段数据类型已替换为全文分析内容的text字段，以及未分析精确字符串值的keyword字段。 出于向后兼容的目的，在5.x系列期间：

*   5.0之前的索引上的string字段将像以前一样工作。
*   新的string字段可以像以前一样添加到5.0之前的索引。
*   text和keyword字段也可以添加到5.0之前的索引。
*   当将string字段添加到新索引时，如果可能，字段映射将重写为text或keyword字段，否则将抛出异常。 使用string字段可能的某些配置不再适用于 text / keyword 字段，例如在未分析的keyword字段上启用term_vectors。

## 默认字符串映射

字符串映射现在具有以下默认映射：

```
{
  "type": "text",
  "fields": {
    "keyword": {
      "type": "keyword",
      "ignore_above": 256
    }
  }
}
```

这允许对原始字段名称执行全文搜索，并在子关键字字段上对聚合进行排序和运行。

## 数字字段

数字字段现在用完全不同的数据结构（称为BKD树）索引，预期需要更少的磁盘空间，并且对于范围查询比之前索引数字的方式更快。

术语查询现在将返回常数分数，而由于文档频率的贡献，它们用于返回较高分数的罕见术语，这种新的BKD结构不记录。 如果需要评分，那么建议将数字字段映射为[`keyword`](https://www.elastic.co/guide/en/elasticsearch/reference/5.0/keyword.html)。

请注意，此 [`keyword`](https://www.elastic.co/guide/en/elasticsearch/reference/5.0/keyword.html "Keyword datatype") 映射不需要替换数字映射。 例如，如果您需要在数字字段上同时排序和评分，则可以使用 `[fields](https://www.elastic.co/guide/en/elasticsearch/reference/5.0/multi-fields.html "fields") `将其映射为number和keyword：

```
PUT my_index
{
  "mappings": {
    "my_type": {
      "properties": {
        "my_number": {
          "type": "long",
          "fields": {
            "keyword": {
              "type":  "keyword"
            }
          }
        }
      }
    }
  }
}
```

此外，precision_step参数现在不相关，并且将在5.0之后或之后创建的索引上被拒绝。

## geo_point字段

像数值字段一样，地理点字段现在使用新的BKD树结构。由于此结构基本上设计用于多维空间数据，因此不再需要或支持以下字段参数：geohash，geohash_prefix，geohash_precision，lat_lon。从API角度仍然支持Geohash，仍然可以使用.geohash字段扩展访问，但它们不再用于索引地理点数据。

## _timestamp和_ttl

_timestamp和_ttl字段已弃用，现在已删除。作为_timestamp的替代品，您应该使用应用程序端的当前时间戳填充常规日期字段。对于_ttl，您应该在适用时使用基于时间的索引，或者在时间戳字段上使用范围查询cron删除查询

## index 属性

在所有字段数据类型（除了已弃用的字符串字段）中，index属性现在只接受true / false，而不接受not_analyzed / no。字符串字段仍接受analyze / not_analyzed / no。

## 未索引字段上的文档值

以前，将字段设置为index：no也会禁用doc值。现在，除非将doc_values设置为false，否则会始终对数字和布尔字段启用文档值。

## 浮点使用float而不是double

当动态映射包含浮点数的字段时，该字段现在默认使用float而不是double。 推理是浮点在大多数情况下应该足够了，但会显着降低存储要求。

## norms

norms现在采用布尔而不是对象。 这个布尔值是norms.enabled的替换。 没有norms.loading的替代，因为迫切的加载规范是不再有用了，现在规范是基于磁盘的。

## fielddata.format

在用于在字段上隐式启用文档值的映射中设置fielddata.format：doc_values。 这不再有效：启用或停用文档值的唯一方法是使用映射的doc_values属性。

## fielddata.filter.regex

正则表达式过滤器不再受支持，将在升级时删除。

## 源变换已删除

源变换要素已删除。 相反，使用ingest管道。

## 字段映射限制

为了防止映射爆炸，以下限制应用于在5.x中创建的索引：

*   索引中的最大字段数限制为1000。
*   字段的最大深度（1加上对象或嵌套父对象的数量）限制为20。
*   索引中嵌套字段的最大数量限制为50。

有关更多信息，请参阅“[防止映射爆炸的设置](https://www.elastic.co/guide/en/elasticsearch/reference/5.0/mapping.html#mapping-limit-settings)”一节。

## _parent字段不再索引

父文档和子文档之间的联接不再依赖于索引字段，因此从5.0.0开始，_parent字段不再索引。为了查找引用特定父标识的文档，可以使用新的parent_id查询。 GET响应和搜索响应内的命中仍包括_parent键下的父标识。

## 源format选项

_source映射不再支持format选项。在升级到5.0之前创建的索引仍然可以被接受，以实现向后兼容性，但是它没有效果。在5.0之前或之后创建的指数将拒绝此选项。

## 对象符号

核心类型不再支持对象符号，用于提供每个文档的提升如下：

```
{
  "value": "field_value",
  "boost": 42
}
```

## 提高对_all的查询的准确性

_all上的每字段增强现在压缩为单个字节，而不是先前使用的4个字节。 虽然这将使索引更具空间效率，但这也意味着索引时间提升将不太准确地编码。

## _ttl和_timestamp不能被创建

您不能再使用_ttl或_timestamp创建索引。 在5.0之前创建的启用的索引将继续工作。

您应该在新索引中替换_timestamp，方法是在生成数据的应用程序中或使用如下所示的ingest pipline向源中添加字段：

```
PUT _ingest/pipeline/timestamp
{
  "description" : "Adds a timestamp field at the current time",
  "processors" : [ {
    "set" : {
      "field": "timestamp",
      "value": "{{_ingest.timestamp}}"
    }
  } ]
}

PUT newindex/type/1?pipeline=timestamp
{
  "example": "data"
}

GET newindex/type/1
```

哪个生产

```
{
  "_source": {
    "example": "data",
    "timestamp": "2016-06-21T18:48:55.560+0000"
  },
  ...
}
```

如果您有使用2.x创建的旧索引已启用_timestamp，那么您可以将其迁移到具有reindex的源中的时间戳字段的新索引：

```
POST _reindex
{
  "source": {
    "index": "oldindex"
  },
  "dest": {
    "index": "newindex"
  },
  "script": {
    "lang": "painless",
    "inline": "ctx._source.timestamp = ctx._timestamp; ctx._timestamp = null"
  }
}
```

可以使用基于时间的索引名称（首选）替换_ttl，或者通过添加在源文档中的时间戳字段上运行按查询删除的cron作业。如果你有这样的文件：

```
POST index/type/_bulk
{"index":{"_id":1}}
{"example": "data", "timestamp": "2016-06-21T18:48:55.560+0000" }
{"index":{"_id":2}}
{"example": "data", "timestamp": "2016-04-21T18:48:55.560+0000" }
```

然后，您可以从6月1日之前删除所有文档：

```
POST index/type/_delete_by_query
{
  "query": {
    "range" : {
      "timestamp" : {
        "lt" : "2016-05-01"
      }
    }
  }
}
```

请记住，从索引中删除文档与删除整个索引相比非常昂贵。这就是为什么推荐基于时间的索引超过这种事情，为什么_ttl首先被废弃。

## 不支持空字段名称

在5.0之后不允许在映射中出现空字段名称。