功能应用场景
在很多业务场景中会涉及到区间范围查询的需求,比如常见的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
在ha3 schema场景下,range索引支持个数:独享型支持8个,共享型支持4个