如何用ES做LBS和活跃的组合自定义排序
来源:1-1 导学
ailuoy
2021-02-06
前言
- Hi 瓦力老师, 因为时间紧迫, 所以就直接发了问题帖… 还望理解~ 谢谢~~
需求
- 如何用ES做
LBS和活跃的组合自定义排序
ES版本
- 7.7.0
需求描述
- 我们目前是用的ES做的LBS, 本来信息流的规则就是按照附近的人直接排序, 现在有个新需求,排序规则如下
1. 附近50km内 小于等于10分钟内 活跃的女生
2. 附近20km内 10~60分钟内 活跃的女生
3. 附近 20-50km内 10~60分钟活跃的女生
4. 附近50km内 60分钟~24小时内活跃的女生
5. 附近50km内 大于24小时活跃的女生
6. 大于50km的女生按照距离排序
es字段描述
- location : 存用户经纬度,实时更新
- activite_at : 活跃时间,实时更新
- …
查询20公里到30公里用户方案
因为在6.0之后就废弃了
geo_distance_range
curl -H 'Content-Type: application/json' -XGET http://127.0.0.1:9200/user_location/_search -d'
{"sort":[{"_geo_distance":{"location":[109.228173,33.536477],"order":"asc","mode":"min","distance_type":"arc","unit":"m"}}],"from":1,"size":100,"query":{"bool":{"filter":{"geo_distance":{"distance":"30km","location":{"lat":33.536477,"lon":109.228173}}},"must_not":{"geo_distance":{"distance":"20km","location":{"lat":33.536477,"lon":109.228173}}}}}}
'
我的方案
- 不是有6个规则么,我就写6个查询,6个调用, 按照feed流每页10个的方式去拼接数据
弊端
- 这方方式太累了… 每次都要去判断每个查询获取到的数据够不够,不够就去下一个查询取出, 而且当第一个规则的集合取完了之后, 当前分页还不能去第一个里面拿数据
- 很难拓展
期望方案
- ES里面有没有什么方法可以直接按照我的要求,直接排好序… 我只管分页取就行了…
写回答
1回答
-
瓦力老师
2021-02-09
个人建议还是分场景做前置索引
00
相似问题