企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 映射改变 原文链接 : [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之后不允许在映射中出现空字段名称。