如何用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

个人建议还是分场景做前置索引

0
0

BAT大牛亲授 基于ElasticSearch的搜房网实战

ES+MySQL+Kafka,打造强力站内搜索

898 学习 · 285 问题

查看课程