当您在时序场景下,按照时间范围过滤数据进行查询,遇到数据量增大后查询延迟增大的问题时,可通过时序查询剪枝功能提高查询性能。本文介绍时序查询剪枝功能的使用方法。

前提条件

已创建阿里云ES实例,且版本为6.7.0,内核版本为1.2.0及以上。创建实例的方法请参见创建阿里云Elasticsearch实例

背景信息

与原生ES相比,阿里云ES使用了时序查询剪枝功能后,在段合并策略和查询性能方面的对比如下。
产品 段合并策略 性能
原生ES 按文件大小相似性进行合并,类似分层合并。其最大优点是合并高效,但不能保证数据的连续性。 查询时需扫描全部数据,性能损耗严重。
阿里云ES使用时序查询剪枝功能 引入时序字段参与索引合并,合并过程中考虑了时间顺序和文件大小两个因素,时间相邻的数据会被合并在同一个段,提升数据连续性。 查询时按时间范围对数据进行裁剪,查询性能提升了40%。
说明 本文中的命令均可在Kibana控制台中执行,详情请参见登录Kibana控制台

注意事项

  • 目前仅实例版本为6.7.0、内核版本为1.2.0及以上的阿里云ES实例支持时序查询剪枝功能。
  • 请在创建索引时开启时序查询剪枝功能,在创建后开启会影响查询性能的提升。
  • 当关闭索引的时序查询剪枝功能后,建议不要再次开启。如果再次开启,当对应索引的段合并中存在非时序数据时,会影响查询性能的提升。

开启时序查询剪枝功能

在创建索引时,为该索引开启时序查询剪枝功能并指定时序字段。
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"
                        ]
                    }
                }
            ]
        }
    }
}

关闭时序查询剪枝功能

  1. 关闭索引。
    POST index-1/_close
  2. 更新索引settings,关闭该索引的时序查询剪枝功能。
    PUT index-1/_settings
    {
        "index" : {
            "merge.policy.time_series_field" : null
        }
    }
  3. 重新开启索引。
    POST index-1/_open