我可以在Solr中组合结果集

时间:2016-07-28 14:15:49

标签: solr solrnet

我想做以下事情: 设A是一组文档,每个文档都包含重要字段:true,以及从今年或上一年开始的日期。结果集应按日期排序。在伪代码中:

结果集A:

q="testquery" +important:true AND +(date:2015* OR date:2016*)
sort=date desc

然后,让B成为剩余的文档集,即 那些重要的:true和2015年之前的日期,以及所有重要的文档:false 。此套装也应按日期排序。再次以非常草率的伪:

结果集B:

q="testquery" -(date:2015* OR date:2016*)
sort=date desc

现在,我想返回A,然后是B,并且能够使用分页功能等。我非常喜欢SOLR(< 10小时尝试不同的查询),我无法形象如何完成这个行为。我想我不能使用bq,因为我们不按分数排序,对吧?

期望结果的一个例子:

<result name="response" numFound="2089" start="0">
    <doc>
        <bool name="important">true</bool>
        <str name="date">2016-03-01 00:00:00</str>
    </doc>
    <doc>
        <bool name="important">true</bool>
        <str name="date">2015-12-01 00:00:00</str>
    </doc>
    <doc>
        <bool name="important">true</bool>
        <str name="date">2015-04-01 00:00:00</str>
    </doc>
    <doc>
        <bool name="important">true</bool>
        <str name="date">2015-01-01 00:00:00</str>
    </doc>
    <doc>
        <bool name="important">false</bool>
        <str name="date">2016-10-01 00:00:00</str>
    </doc>
    <doc>
        <bool name="important">false</bool>
        <str name="date">2015-03-01 00:00:00</str>
    </doc>
    <doc>
        <bool name="important">false</bool>
        <str name="date">2014-02-01 00:00:00</str>
    </doc>
    <doc>
        <bool name="important">true</bool>
        <str name="date">2014-09-01 00:00:00</str>
    </doc>
    <doc>
        <bool name="important">false</bool>
        <str name="date">2013-05-01 00:00:00</str>
    </doc>
    <doc>

    <str name="date">2012-09-01 00:00:00</str>
    </doc>
    </result>
</response>

请注意,在上面的示例中,对于早于2015年的文档,标记为重要的文档并不比其他任何文档更重要,它们将按严格的时间顺序显示。

感谢任何帮助,但我特别喜欢使用SolrNet语法的示例:)

修改 我无法对索引或架构进行任何更改......

2 个答案:

答案 0 :(得分:2)

((important: true AND (date:2016* OR date:2015*))^1001 OR (important: false AND (date:2016* OR date:2015*))^1000 OR date:*) AND something:"foo"并排序score desc, date desc

这将首先显示最近的重要项目,然后是最近的非重要项目,最后是所有项目,以及按“日期”在“部分”中排序的所有内容。

该条款末尾的

something:"foo"指的是您可能拥有的任何额外条款。

答案 1 :(得分:1)

这里的主要挑战 - 我觉得 - 按日期排序。没有它,您可以轻松地将您的特权权限查询提升到最前面。但按日期排序后会重置这个,你会回到你开始的地方。

但有可能sort by several fields。因此,如果您的特殊条件可以在索引编制期间编码为字段值,则可以先按日期排序,然后按日期排序。

如果在索引编制过程中无法做到这一点,您可能需要添加第二个技巧。可以sort by a function query而不是字段。因此,您需要构建一个函数查询表达式(可能至少使用 if ms )来表示您的提升条件。

您可能面临一些代表2015/2016的挑战。如果是日期,您可以使用date math创建一致的向下舍入到一年(NOW / YEAR)。

我首先要做一个简单的问题,只需将重要的项目推到顶部,仍按日期排序。只是为了测试我的逻辑在这里工作。如果/一次使用函数,排序和分页,可以将特殊日期添加到计算中。