全部产品
云市场

range查询

更新时间:2019-06-14 11:52:02

一. 功能应用场景

在很多业务场景中会涉及到区间范围查询的需求,比如常见的O2O业务中会基于搜索用户所在地理位置的某个范围内的商家进行查询;商品搜索中也会有基于商品最低和最高价格区间的查询;还有后台类大数据检索场景中也会有查找某个时间段内的结果需求。以往在OpenSearch中需要通过filter子句来解决这部分需求,但由于filter子句为正排索引查询,所以查询性能会很差,有时甚至会超时,基于此目前上线range查询功能为客户提供服务。

二. 性能说明

经过线上实战验证,查询3.4亿doc时,符合range区间条件的doc数在1万以内时,使用range查询的查询耗时比用filter子句下降了240%;符合range区间条件的doc数在1亿左右时,使用range查询的查询耗时比用filter下降了101%,

三. 使用方法

实现range查询总共分3步:

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

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

字段类型 说明 系统限制
INT int64类型整数, 支持INT类型数据的范围查询。 最多只能有4个字段为该类型。
TIMESTAMP 大于等于0的整数时间戳,单位为毫秒。提供时间戳类型数据的范围查询。 最多只能有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类型的语法相同,支持的查询语法如下:

  1. index:[number1,number2] // number1 <= index <= number2
  2. index:[number1,number2) // number1 <= index < number2
  3. index:(number1,number2] // number1 < index <= number2
  4. index:(number1,number2) // number1 < index < number2
  5. index:(,number2) // index < number2
  6. index:(number1,) // index > number1
  7. index:(,number2] // index <= number2
  8. index:[number1,) // index >= number1

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

例如,
在商品中搜索 价格在100-200元“连衣裙”:
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之间的毫秒时间戳,即[0, 4102416000000]。超过4102416000000的值都当作4102416000000处理。如果需要区分大于4102416000000的时间,需要加filter做过滤。
  • GEO_POINT字段类型精度范围为,经度:-180~180,纬度-90~90