在 Solr 中,如何根据文档的属性对文档进行不同的排序?

问题描述

我的文档有以下 2 个字段:

  • 状态
    • 打开
    • 即将推出
    • 结束
  • 结束日期

现在我是这样排序的:

status_int ASC,end_date ASC(status_int 只是一种通过状态打开 -> 即将到来 -> 结束轻松排序的方式)

对于 openupcoming 事件,我想显示那些最快结束的事件,这就是我有 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 结束日期。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...