使用RediSearch的GEOFILTER时如何先按数值字段再按距离排序结果
RediSearch GEOFILTER多级排序实现方案
1. 索引预处理
首先在建索引时,将优先排序的数值字段(如示例中的价格price)定义为NUMERIC类型,地理位置字段定义为GEO类型。推荐给排序字段添加SORTABLE标识,可大幅提升大数据量下的排序性能:
FT.CREATE shops SCHEMA price NUMERIC SORTABLE location GEO
2. 多级排序查询
RediSearch提供内置虚拟字段GEODISTANCE,仅在使用GEOFILTER查询时自动生成,存储了查询坐标与结果坐标的实际距离,单位与GEOFILTER指定的单位完全一致。
你可以直接在SORTBY参数中依次指定多级排序规则即可满足需求,示例如下(查询坐标116.40、39.90周边5公里内的商铺,优先按价格升序,同价按距离升序,返回前10条结果):
FT.SEARCH shops "*" GEOFILTER location 116.40 39.90 5 km SORTBY 4 price ASC GEODISTANCE ASC LIMIT 0 10
参数说明:
SORTBY 4:表示后续跟随4个排序参数,对应2组排序规则(每组规则为「字段名+排序方向」2个参数)price ASC:第一级排序规则,按价格从低到高GEODISTANCE ASC:第二级排序规则,按距离从近到远
3. 扩展:返回距离字段
如果需要在返回结果中直观查看距离数值,可通过RETURN参数将GEODISTANCE别名后返回:
FT.SEARCH shops "*" GEOFILTER location 116.40 39.90 5 km SORTBY 4 price ASC GEODISTANCE ASC RETURN 2 GEODISTANCE distance LIMIT 0 10
注意事项
- 未标记
SORTABLE的字段也可参与排序,仅大数据量场景下查询性能会有所降低 GEOFILTER支持m(米)、km(公里)、mi(英里)、ft(英尺)四种单位,GEODISTANCE的单位会和查询时指定的单位保持一致
内容的提问来源于stack exchange,提问作者zigzag
相关产品推荐
相关产品推荐

