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

In Solr, how to sort documents differently based on their attributes?

我的文档有这两个字段:

现在我是这样排序的:

status_int ASC, end_date ASC(status_int 只是一种按状态轻松排序的方式 open -> coming -> ended)

对于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,
        q="yourQuery",
        qt="/export", //or "/select" based on your needs
        fq="status:ended",
        sort="end_date desc"
    )
)

这将首先 return 未结束的按 end_date asc 排序,然后是 status=ended 的按 end_date desc 排序。您也可以根据其他条件对它们重新排序,或根据您的要求以不同方式合并它们。


另一个更简单的解决方案可能是使用函数查询和伪字段,类似于:

&fl=sortonthis:if(not(status=ended),rord(end_date),ord(end_date))&sort=sortonthis asc

我没有测试,但应该可以进行一些调整。

如果对于尚未结束的事件,end_date 总是在未来,您可以使用 abs(ms(NOW, end_date)) 使其工作 - 它会给您一个值,表示距离结束日期的当前日期。