概述
Elasticsearch 5.0.0 GA, 基于Lucene 6.2.0。Elasticsearch 5.0.0 带来了大量的改进和新功能,与之前的版本相比更快、更安全、更具有弹性,也更容易使用。
本文主要分为两部分。第一部分从整体上,了解Es5.x版本的新特性及进行这些改变的初衷。第二部分从具体功能细节了解新版本的改变。
新的数据结构
block k-d tree
Lucene 6.x针对 numeric and geo-point 字段添加了新的点型数据结构 ——dimensional points Fields,多维浮点字段。该数据结构使用基于k-d树的地理空间数据结构来提供快速的单维或多维数值范围和地理空间点的过滤。
数据结构采用的是改进的k-d树——block k-d tree 。block k-d tree 对IO效率做了特殊处理,使得大部分数据结构驻留在磁盘块上,在搜索时,使用小的堆内二叉树索引结构来定位块。
这意味着最终能够使用Lucene来有效地索引和范围过滤任何可以被编码为固定长度,有序字节的东西,比如IPv6 InetAddress,BigInteger,BigDecimal等,以及2D和3D或更高维度的地理空间索引和时间序列值。
对于数值型(IP,时间,数值)和geo_point的性能有很大的提高。
half_float 和 scaled_float
添加了两个新的数值字段类型 half_float 和 scaled_float
- half_float : 16位的半精度浮点型。
- scaled_float:固定比例的浮点型。内部存储为long。该字段类型需要指定比例因子scaling_factor。
PUT my_index
{
"mappings": {
"my_type": {
"properties": {
"number_of_bytes": {
"type": "integer"
},
"time_in_seconds": {
"type": "half_float"
},
"price": {
"type": "scaled_float",
"scaling_factor": 100
}
}
}
}
}
例如:
scaled_float 若比例因子为10,则2.34 会存储为23 ,所有的搜索操作(queries, aggregations, sorting) 会匹配文档中的2.3。 高的比例因子scaling_factor会提高精度,但是也会增加存储负担。
text和keyword类型
string类型移除,被Text和Keyword两种类型代替。
- text 类型的数据用于全文检索(analyzed string)
keyword类型的用于关键词完全匹配搜索(not_analyzed string )。
新的默认类型
索引如下内容:
{
"foo": "bar"
}
新的默认创建的mapping如下:
{
"foo": {
"type" "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
既可以对foo字段全文检索, 也可以对foo.keyword实现关键词搜索和聚合。
可以通过指定string类型或动态模板(dynamic template )来禁用这个功能。
通过如下的动态模板来存储es2.x中的dynamic mappings
{
"match_mapping_type": "string",
"mapping": {
"type": "text"
}
}
原string类型迁移
原_1:
{
"foo": {
"type" "string",
"index": "analyzed"
}
}
新_1:
{
"foo": {