目前在做一个搜索功能,使用 Elasticsearch,要求搜索结果中_score 大于 x 的按照时间降序排,_score 小于 x 的按照_score 降序排,使用的 Gem 是 retire。
_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 条,然后在内存里按要求处理数据。这种做法对要求有所裁剪,性能也不太好,但基本能符合要求。
给你一个链接 按受欢迎程度提升权重 https://www.elastic.co/guide/cn/elasticsearch/guide/current/boosting-by-popularity.html 你把时间值转换为收欢迎程度,比如时间越大(用浮点值表示时间)相关度越高,就可以解决。