映射改变

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

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

贡献者 : 片刻

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。

默认字符串映射

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

  1. {
  2. "type": "text",
  3. "fields": {
  4. "keyword": {
  5. "type": "keyword",
  6. "ignore_above": 256
  7. }
  8. }
  9. }

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

数字字段

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

术语查询现在将返回常数分数,而由于文档频率的贡献,它们用于返回较高分数的罕见术语,这种新的BKD结构不记录。 如果需要评分,那么建议将数字字段映射为keyword

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

  1. PUT my_index
  2. {
  3. "mappings": {
  4. "my_type": {
  5. "properties": {
  6. "my_number": {
  7. "type": "long",
  8. "fields": {
  9. "keyword": {
  10. "type": "keyword"
  11. }
  12. }
  13. }
  14. }
  15. }
  16. }
  17. }

此外,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之前或之后创建的指数将拒绝此选项。

对象符号

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

  1. {
  2. "value": "field_value",
  3. "boost": 42
  4. }

提高对_all的查询的准确性

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

_ttl和_timestamp不能被创建

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

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

  1. PUT _ingest/pipeline/timestamp
  2. {
  3. "description" : "Adds a timestamp field at the current time",
  4. "processors" : [ {
  5. "set" : {
  6. "field": "timestamp",
  7. "value": "{{_ingest.timestamp}}"
  8. }
  9. } ]
  10. }
  11. PUT newindex/type/1?pipeline=timestamp
  12. {
  13. "example": "data"
  14. }
  15. GET newindex/type/1

哪个生产

  1. {
  2. "_source": {
  3. "example": "data",
  4. "timestamp": "2016-06-21T18:48:55.560+0000"
  5. },
  6. ...
  7. }

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

  1. POST _reindex
  2. {
  3. "source": {
  4. "index": "oldindex"
  5. },
  6. "dest": {
  7. "index": "newindex"
  8. },
  9. "script": {
  10. "lang": "painless",
  11. "inline": "ctx._source.timestamp = ctx._timestamp; ctx._timestamp = null"
  12. }
  13. }

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

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

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

  1. POST index/type/_delete_by_query
  2. {
  3. "query": {
  4. "range" : {
  5. "timestamp" : {
  6. "lt" : "2016-05-01"
  7. }
  8. }
  9. }
  10. }

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

不支持空字段名称

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