当您在时序场景下,按照时间范围过滤数据进行查询,遇到数据量增大后查询延迟增大的问题时,可通过时序查询剪枝功能提高查询性能。本文介绍时序查询剪枝功能的使用方法。
前提条件
已创建阿里云Elasticsearch实例,且实例版本为6.7.0,内核版本为1.2.0及以上,或者实例版本为7.10.0。创建实例的方法请参见创建阿里云Elasticsearch实例。背景信息
与原生Elasticsearch相比,阿里云Elasticsearch使用了时序查询剪枝功能后,在段合并策略和查询性能方面的对比如下。产品 | 段合并策略 | 性能 |
原生Elasticsearch | 按文件大小相似性进行合并,类似分层合并。其最大优点是合并高效,但不能保证数据的连续性。 | 查询时需扫描全部数据,性能损耗严重。 |
阿里云Elasticsearch使用时序查询剪枝功能 | 引入时序字段参与索引合并,合并过程中考虑了时间顺序和文件大小两个因素,时间相邻的数据会被合并在同一个段,提升数据连续性。 | 查询时按时间范围对数据进行裁剪,查询性能提升了40%。 |
说明 本文中的命令均可在Kibana控制台中执行,详情请参见登录Kibana控制台。
注意事项
- 目前仅实例版本为6.7.0、内核版本为1.2.0及以上,或者实例版本为7.10.0的阿里云Elasticsearch实例支持时序查询剪枝功能。
- 请在创建索引时开启时序查询剪枝功能,在创建后开启会影响查询性能的提升。
- 当关闭索引的时序查询剪枝功能后,建议不要再次开启。如果再次开启,当对应索引的段合并中存在非时序数据时,会影响查询性能的提升。
开启时序查询剪枝功能
在创建索引时,为该索引开启时序查询剪枝功能并指定时序字段。
PUT index-1/_settings
{
"index" : {
"merge.policy.time_series_field" : "timestamp"
}
}
重要 时序字段的类型必须为date或long类型。
根据指定时序字段查询数据
如下示例,根据指定的时序字段timestamp,过滤数据后再进行查询。
POST index-1/_search
{
"query": {
"bool": {
"filter": [
{
"range": {
"timestamp": {
"format": "yyyy-MM-dd HH:mm:ss",
"gte": "2020-06-01 23:00:00",
"lt": "2020-06-06 23:05:00",
"time_zone": "+08:00"
}
}
},
{
"terms": {
"region": [
"sh"
]
}
}
]
}
}
}
关闭时序查询剪枝功能
- 关闭索引。
POST index-1/_close
- 更新索引
settings
,关闭该索引的时序查询剪枝功能。PUT index-1/_settings { "index" : { "merge.policy.time_series_field" : null } }
- 重新开启索引。
POST index-1/_open