【问题标题】:In Solr, how to sort documents differently based on their attributes?在 Solr 中,如何根据文档的属性对文档进行不同的排序?
【发布时间】:2021-02-12 08:04:44
【问题描述】:

我的文档有这两个字段:

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

现在我是这样排序的:

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

对于openupcoming 事件,我想先显示最快结束的事件,这就是我有end_date ASC 的原因。问题是它不适用于已结束的事件,因为用户将获得 2010 年的事件,例如在 2020 年结束的事件之前。

所以,我想通过end_date ASC 订购没有结束状态的文档,end_date DESC 订购结束状态。

是否可以根据文档属性更改顺序?

【问题讨论】:

    标签: sorting solr sunspot


    【解决方案1】:

    在我看来,一个简单的解决方案是使用流表达式,尽管它们的可用性取决于一些技术细节(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"
        )
    )
    

    这将首先返回按 end_date asc 排序的未结束的,然后返回按 end_date desc 排序的 status=ended。您还可以根据其他条件再次对它们进行排序,或者根据您的要求进行不同的合并。


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

    &fl=sortonthis:if(not(status=end),rord(end_date),ord(end_date))&sort=sortonthis 升序

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

    【讨论】:

    • 谢谢,我会尝试使用伪字段方法。
    • 最后,我们采用了不同的方法。我们将日期转换为整数(Unix 时间),如果日期是过去,我们将它们设为负数(当 end_date 过去时,我们已经重新索引事件)。这样,最近结束的事件比之前结束的事件具有“更高”的绝对值,但由于它是负数,它将是一个较小的整数,因此对 ASC 进行排序将得到我们需要的结果。
    【解决方案2】:

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

    【讨论】:

    • 你会在什么级别上做这件事?我正在使用 Sunspot,它是一个 rails gem,所以我非常熟悉 solr 查询的编写方式。你对性能影响有猜测吗?它是否等同于上面建议的伪场方法?还是您建议我在伪字段中使用此表达式?泰。
    • 我对太阳黑子不是很熟悉,所以不知道。对于性能,测试这两个建议,看看哪一个表现足够好。
    猜你喜欢
    • 2012-03-21
    • 2017-11-19
    • 1970-01-01
    • 2020-10-17
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    相关资源
    最近更新 更多