Rails 关于 ElasticSearch 排序的问题

ecloud · 2019年01月04日 · 最后由 ecloud 回复于 2019年01月04日 · 1086 次阅读

目前在做一个搜索功能,使用Elasticsearch,要求搜索结果中_score大于x的按照时间降序排,_score小于x的按照_score降序排,使用的Gem是retire。

共收到 17 条回复

PM是实习生吗

hooopo 回复

客户要求跟pm没关系,PM也必须接活啊

3楼 已删除

求助,目前怎么做完全没头绪。

ecloud 回复

用pg还真能实现,es嘛就算了,得引groovy script

hooopo 回复

目前使用的是mysql+es,不可能迁移到pg的,成本太高了,😢

hooopo 回复

有办法在retire中使用groovy script吗?

查两次再拼起来呗……

southwolf 回复

分页怎么解决呢?😢

搜索2次,分开显示。 或加入权重。

sevk 回复

搜索2次,分页怎么做?一直没想到方法解决分页问题

有大佬给个思路吗?

ecloud 回复

_score小于x的按照_score降序排

_score大于x的也按照_score降序排,并不会影响小于x的所在的页;

1.用_score降序分页查询,如果查出的这一页都大于x,那就重新按照create_time降序(建议换成id)查询该页,返回数据

2.如果查出这一页都小于x,就按照_score降序排直接返回数据

3.如果这一数据跨跃x,就将小于x的数据保留,重新按照create_time降序(建议换成id)查询该页,和刚才小于x的拼接,返回数据

先搞清楚这个需求的意图是什么,如果是要在 score 里纳入时间因素,ES 有很好的解决方法。

如果非要硬实现这个要求,一种方法是返回很多条按 score 排序的数据,比如 1000 条,然后在内存里按要求处理数据。这种做法对要求有所裁剪,性能也不太好,但基本能符合要求。

Laotree 回复

懂了,特殊情况需要自己内存中排序

vincent 回复

如果想再score中纳入时间因素有哪些好的解决方案?初学ES,有很多不懂的地方。

ecloud 回复

给你一个链接 按受欢迎程度提升权重 https://www.elastic.co/guide/cn/elasticsearch/guide/current/boosting-by-popularity.html 你把时间值转换为收欢迎程度,比如时间越大(用浮点值表示时间)相关度越高,就可以解决。

vincent 回复

文档写的很好,🙏。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册