更新时间:2020-08-19 19:09
在很多业务场景中会涉及到区间范围查询的需求,比如常见的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类型的语法相同,支持的查询语法如下:
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元“连衣裙”: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)'
query=spatial_index:'circle(LON LAT,Radius)'
query=spatial_index:'circle(116.5806 39.99624, 1000)'
,查询在坐标’116.5806 39.99624’附近1000米(1公里)以内的文档。query=spatial_index:'rectangle(minX minY,maxX maxY)'
在文档使用中是否遇到以下问题
更多建议
匿名提交