【问题标题】:Solr demote all documents with conditionSolr 将所有有条件的文档降级
【发布时间】:2016-10-13 15:57:11
【问题描述】:

我想将所有 inv=0(可能的值从 0 到 1000)的文档降级到结果集的末尾。我还有其他排序选项,例如 name desc 也作为查询的一部分。

例如下面是我的 solr 文档

Doc1 : name=apple , Inv=2
Doc2 : name=ball , Inv=1
Doc3 : name=cat , Inv=0
Doc4 : name=dog , Inv=0
Doc5 : name=fish , Inv=4
Doc6 : name=Goat , Inv=5

我想实现下面的排序......在这里,我想将所有 inv=0 的文档向下推到底部,然后应用“name asc”排序。

Doc1
Doc2
Doc5
Doc6
Doc3
Doc4

我的 solr 请求就像

bq: "(: AND -inv:"0")^999.0" & defType: "edismax"

这里 999 是我给降级结果的等级。

这个提升查询工作正常。它将所有 inv=0 的文档移到底部。

但是当我将 &sort=name asc 添加到 solr 查询时,它会将“排序”优先于 bq..我看到下面的结果带有“名称 asc”。

Doc1 : name=apple , Inv=2
Doc2 : name=ball , Inv=1
Doc3 : name=cat , Inv=0
Doc4 : name=dog , Inv=0
Doc5 : name=fish , Inv=4
Doc6 : name=Goat , Inv=5

谁能帮帮我。 ?

【问题讨论】:

    标签: solr edismax solr-query-syntax solr-boost


    【解决方案1】:

    简单的解决方案:您可以先按inv 排序,然后再按其他值排序。这要求inv 仅具有真 (1) 或假 (0) 值。我猜不是这样,所以:

    您可以通过函数查询进行排序 - 您可以使用函数if 根据是否设置值返回不同的值:

    sort=if(inv, 1, 0) desc, name desc
    

    如果 Solr 无法自行解析 inv,您可以使用 field(inv),但这不是必需的。

    另一种选择是使用函数 min 为排序字段获取 1 或 0,具体取决于它是否在库存中:

    sort=min(1, inv)
    

    【讨论】:

    • 谢谢。但我不想按 inv 排序(库存的值可以从 0 到 1000)。我只想按名称排序,但所有记录的最后值为 0。是此处可用的 map 函数。我该如何使用它
    • “所有最后值为 0 的记录”是默认排序。通过使用如图所示的if 函数查询(或最小版本),排序的唯一值将是 0 或 1。然后,下一个排序字段将再次给出该排序中的方向。如果这不能如您预期的那样给出正确的结果,请举一个例子。使用 map 应该不是必需的(但可能),但您仍然必须按值排序才能使文档排在最后。
    • 嗨,我试过 &sort=min(1, field(inv)) desc, name_ntk desc 没用。
    • 我在下面试过 1.sort=name desc, if(exists(query({!v='inv:0'})), 1, 0) desc 也
    • 由于某种原因,当我按下回车键时,评论关闭,我无法在 stackoverflow 上编辑评论。好的..对不起。我也试过 sort=if(inv, 1, 0) desc, name desc 也试过 &sort=map(inv,0,0,inv,0),name desc ...似乎没有任何效果。我是 solr 术语的新手。你能给我整个排序查询字符串吗?
    猜你喜欢
    • 1970-01-01
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    • 2017-12-09
    • 2011-07-29
    • 1970-01-01
    相关资源
    最近更新 更多