在Solr中,如何根据文档的属性对文档进行不同的排序?
In Solr, how to sort documents differently based on their attributes?
我的文档有这两个字段:
- 状态
- 打开
- 即将到来
- 结束
- end_date
现在我是这样排序的:
status_int ASC, end_date ASC
(status_int 只是一种按状态轻松排序的方式 open -> coming -> ended)
对于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,
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))
使其工作 - 它会给您一个值,表示距离结束日期的当前日期。
我的文档有这两个字段:
- 状态
- 打开
- 即将到来
- 结束
- end_date
现在我是这样排序的:
status_int ASC, end_date ASC
(status_int 只是一种按状态轻松排序的方式 open -> coming -> ended)
对于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,
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))
使其工作 - 它会给您一个值,表示距离结束日期的当前日期。