string字段数据类型已替换为全文分析内容的text字段,以及未分析精确字符串值的keyword字段。 出于向后兼容的目的,在5.x系列期间:
字符串映射现在具有以下默认映射:
{
"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之后或之后创建的索引上被拒绝。
像数值字段一样,地理点字段现在使用新的BKD树结构。由于此结构基本上设计用于多维空间数据,因此不再需要或支持以下字段参数:geohash,geohash_prefix,geohash_precision,lat_lon。从API角度仍然支持Geohash,仍然可以使用.geohash字段扩展访问,但它们不再用于索引地理点数据。
_timestamp和_ttl字段已弃用,现在已删除。作为_timestamp的替代品,您应该使用应用程序端的当前时间戳填充常规日期字段。对于_ttl,您应该在适用时使用基于时间的索引,或者在时间戳字段上使用范围查询cron删除查询
在所有字段数据类型(除了已弃用的字符串字段)中,index属性现在只接受true / false,而不接受not_analyzed / no。字符串字段仍接受analyze / not_analyzed / no。
以前,将字段设置为index:no也会禁用doc值。现在,除非将doc_values设置为false,否则会始终对数字和布尔字段启用文档值。
当动态映射包含浮点数的字段时,该字段现在默认使用float而不是double。 推理是浮点在大多数情况下应该足够了,但会显着降低存储要求。
norms现在采用布尔而不是对象。 这个布尔值是norms.enabled的替换。 没有norms.loading的替代,因为迫切的加载规范是不再有用了,现在规范是基于磁盘的。
在用于在字段上隐式启用文档值的映射中设置fielddata.format:doc_values。 这不再有效:启用或停用文档值的唯一方法是使用映射的doc_values属性。
正则表达式过滤器不再受支持,将在升级时删除。
源变换要素已删除。 相反,使用ingest管道。
为了防止映射爆炸,以下限制应用于在5.x中创建的索引:
有关更多信息,请参阅“防止映射爆炸的设置”一节。
父文档和子文档之间的联接不再依赖于索引字段,因此从5.0.0开始,_parent字段不再索引。为了查找引用特定父标识的文档,可以使用新的parent_id查询。 GET响应和搜索响应内的命中仍包括_parent键下的父标识。
_source映射不再支持format选项。在升级到5.0之前创建的索引仍然可以被接受,以实现向后兼容性,但是它没有效果。在5.0之前或之后创建的指数将拒绝此选项。
核心类型不再支持对象符号,用于提供每个文档的提升如下:
{
"value": "field_value",
"boost": 42
}
_all上的每字段增强现在压缩为单个字节,而不是先前使用的4个字节。 虽然这将使索引更具空间效率,但这也意味着索引时间提升将不太准确地编码。
您不能再使用_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之后不允许在映射中出现空字段名称。