Range范围查询

功能应用场景

在很多业务场景中会涉及到区间范围查询的需求,比如常见的O2O业务中会基于搜索用户所在地理位置的某个范围内的商家进行查询;商品搜索中也会有基于商品最低和最高价格区间的查询;还有后台类大数据检索场景中也会有查找某个时间段内的结果需求。

使用方法

实现range查询总共分3步:

1.在定义应用结构中对需要range查询的字段进行相关的字段类型配置。

只有以下字段类型可支持range查询,请按需求进行配置。

字段类型

说明

系统限制

INT

int64类型整数, 支持INT类型数据的范围查询。

最多只能有4个字段为该类型。

TIMESTAMP

大于等于0的整数时间戳,单位为毫秒(存储支持毫秒,查询精度只到秒级,后3位数值默认为000)。提供时间戳类型数据的范围查询。

最多只能有4个字段为该类型。

GEO_POINT

字符串类型,格式为:lon lat。lon表示经度,lat表示纬度,都为double类型,二者之间用空格分隔。lon的范围:[-180, 180], lat范围[-90, 90]。

最多只能有2个字段为该类型。

2.在定义索引结构中对步骤1类型的字段创建索引并指定相关分析器。

TIMESTAMP字段、GEO_POINT字段和INT类型的字段可创建单字段索引,但是不可创建组合索引。

这三个字段创建的索引应选择的分析器及含义可参见下表。

单字段索引包含的字段类型

实现range查询的分析器名称

分析器释义

INT

数值分析

分词方式:不分词索引类型:需要范围查询的数值索引。

TIMESTAMP

数值分析

分词方式:不分词索引类型:需要范围查询的数值索引。

GEO_POINT

地理位置

分词方式:不分词索引类型:需要范围查询的数值索引。

3.在查询中使用range查询语法实现区间查询。

(1)INT与TIMESTAMP的范围查询

INT的范围查询语法与TIMESTAMP类型的语法相同,支持的查询语法如下:

        index:[number1,number2]// number1 <= index <= number2
        index:[number1,number2)//  number1 <= index < number2
        index:(number1,number2]//  number1 < index <= number2
        index:(number1,number2)//  number1 < index < number2
        index:(,number2)// index < number2
        index:(number1,)// index > number1
        index:(,number2]// index <= number2
        index:[number1,)// index >= number1

注意:索引冒号后面不能加引号。

例如:

在商品中搜索价格在100-200 RMB“连衣裙”:

query=index_text:'连衣裙' AND index_price:[100,200]

在新闻中搜索 2019年6月1日-2019年6月3日之间的关于“北京”的新闻:

query=index_text:'北京' AND index_timestamp:[1559318400000,1559577599000]

(2)GEO_POINT的范围查询

目前查询只支持点、圆、矩形的查询,语法如下:

  • 查询点:query=spatial_index:'point(LON LAT)'

LON为经度,LAT为纬度。如:query=spatial_index:’point(116.3906 39.92324)’,查询与这个坐标一样的文档。

  • 查询圆内的点, 可以用于附近若干公里的点查询

query=spatial_index:'circle(LON LAT,Radius)'

LON表示经度,LAT表示纬度,Radius为半径,单位米;半径10公里内性能最佳,超过10公里性能会大幅变差。例如:query=spatial_index:'circle(116.5806 39.99624, 1000)',查询在坐标’116.5806 39.99624’附近1000米(1公里)以内的文档。

  • 查询矩形内的点:

query=spatial_index:'rectangle(minX minY,maxX maxY)'

纬度上,maxY>=minY,如果写反了,会自动调整; 经度上,minX到maxX是由西向东理解的,如果写反了,代表的范围就不对了。例如:rectangle(116.3906 39.92324, 116.3907 39.92325),查询在这两个坐标组成的矩形内的文档。

使用限制

  • TIMESTAMP字段类型的查询精度范围为从1970-01-01 00:00到2100-01-01 00:00之间的毫秒时间戳(存储支持毫秒,查询精度只到秒级,后3位数值默认为000),即[0, 4102416000000]。超过4102416000000的值都当作4102416000000处理。如果需要区分大于4102416000000的时间,需要加filter做过滤。

  • 数值分析索引在做范围查询时,区间值后面的数字需要大于或等于前面的值,否则会报语法错误(6112,Query clause error)

  • GEO_POINT字段类型精度范围为,经度:-180~180,纬度-90~90