如何解决在 Solr 中,如何根据文档的属性对文档进行不同的排序?
我的文档有以下 2 个字段:
-
状态
- 打开
- 即将推出
- 结束
- 结束日期
现在我是这样排序的:
status_int ASC,end_date ASC
(status_int 只是一种通过状态打开 -> 即将到来 -> 结束轻松排序的方式)
对于 open
和 upcoming
事件,我想显示那些最快结束的事件,这就是我有 end_date ASC
的原因。问题是它不适用于已结束的事件,因为用户会在 2020 年结束的事件之前获得 2010 年的事件。
所以,对于没有结束状态的文档,我想按 end_date ASC
排序,对于结束状态的文档,我希望按 end_date DESC
排序。
是否可以根据文档属性更改顺序?
解决方法
在我看来,一个简单的解决方案是使用流表达式,尽管它们的可用性取决于一些技术细节(Solr 版本、您的客户端实现细节等)
启动两个搜索流,一个用于没有结束状态的文档,另一个用于其他。您可以为两个不同的流指定不同的排序条件。然后合并这两个流。类似的东西:
list(
search(
yourCollection,q="yourQuery",qt="/export",//or "/select" based on your needs
fq="*:* AND NOT status:ended",sort="end_date asc"
),search(
yourCollection,//or "/select" based on your needs
fq="status:ended",sort="end_date desc"
)
)
这将首先返回按 end_date asc 排序的未结束的,然后按 end_date desc 排序的 status=ended 返回。您还可以根据其他条件对它们重新排序,或者根据您的要求以不同方式合并它们。
另一种更简单的解决方案可能是使用函数查询和伪字段,大致如下:
&fl=sortonthis:if(not(status=ended),rord(end_date),ord(end_date))&sort=sortonthis 上升
我没有测试,但它应该可以进行一些调整。
,如果 end_date
对于尚未结束的事件总是在未来,您可能可以通过使用 abs(ms(NOW,end_date))
使其工作 - 它会给您一个值,表示离当前事件有多远date 结束日期。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。