我想做以下事情: 设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语法的示例:)
修改 我无法对索引或架构进行任何更改......
答案 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)。
我首先要做一个简单的问题,只需将重要的项目推到顶部,仍按日期排序。只是为了测试我的逻辑在这里工作。如果/一次使用函数,排序和分页,可以将特殊日期添加到计算中。