Rails 关于 ElasticSearch 排序的问题

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

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

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 回复

文档写的很好,🙏。

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