映射改变

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

请注意,此 keyword 映射不需要替换数字映射。 例如,如果您需要在数字字段上同时排序和评分,则可以使用 [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。

有关更多信息,请参阅“防止映射爆炸的设置”一节。

_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之后不允许在映射中出现空字段名称。