我可以在 Solr 中组合结果集吗
Can I combine result sets in Solr
我想做以下事情:
假设 A 是一组文档,每个文档都有字段 important:true,并且日期从今年或上一年开始。结果集应按日期排序。在伪代码中:
结果集A:
q="testquery" +important:true AND +(date:2015* OR date:2016*)
sort=date desc
然后,令 B 为剩余的文档集,即 具有 important:true 且日期早于 2015 年的文档,以及具有 [=39= 的所有文档]。该套装还应按日期订购。再次以非常草率的伪造:
结果集B:
q="testquery" -(date:2015* OR date:2016*)
sort=date desc
现在,我想 return 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 语法的示例:)
编辑:
我无法对索引或架构进行任何更改...
((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
这将首先显示最近的重要项目,然后是最近的非重要项目,最后是所有项目,所有项目都按 'sections' 中的日期排序。
子句末尾的 something:"foo"
指的是您可能拥有的任何额外子句。
这里的主要挑战 - 我觉得 - 是按日期排序。否则,您可以轻松地将您的特权查询提升到最前面。但是按日期后记排序会重置这个,你会回到你开始的地方。
但是 sort by several fields 是可能的。因此,如果您的特殊条件可以在索引期间编码为字段值,您可以先按该条件排序,然后按日期排序。
如果在编制索引期间无法做到这一点,您可能需要添加第二个技巧。可以 sort by a function query 而不是字段。因此,您需要构建一个函数查询表达式(可能至少使用 if 和 ms)来表示您的提升条件。
您可能有一些挑战代表您的 2015/2016 年作为条件。如果它是一个日期,您可以使用 date math 创建一个一致的向下舍入到一年 (NOW/YEAR)。
我会先做一个更简单的问题,将 重要 项目推到顶部,仍然按日期排序。只是为了测试我的逻辑是否有效。 If/once配合函数和排序分页,特殊日期可以加入计算。
我想做以下事情: 假设 A 是一组文档,每个文档都有字段 important:true,并且日期从今年或上一年开始。结果集应按日期排序。在伪代码中:
结果集A:
q="testquery" +important:true AND +(date:2015* OR date:2016*)
sort=date desc
然后,令 B 为剩余的文档集,即 具有 important:true 且日期早于 2015 年的文档,以及具有 [=39= 的所有文档]。该套装还应按日期订购。再次以非常草率的伪造:
结果集B:
q="testquery" -(date:2015* OR date:2016*)
sort=date desc
现在,我想 return 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 语法的示例:)
编辑: 我无法对索引或架构进行任何更改...
((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
这将首先显示最近的重要项目,然后是最近的非重要项目,最后是所有项目,所有项目都按 'sections' 中的日期排序。
子句末尾的something:"foo"
指的是您可能拥有的任何额外子句。
这里的主要挑战 - 我觉得 - 是按日期排序。否则,您可以轻松地将您的特权查询提升到最前面。但是按日期后记排序会重置这个,你会回到你开始的地方。
但是 sort by several fields 是可能的。因此,如果您的特殊条件可以在索引期间编码为字段值,您可以先按该条件排序,然后按日期排序。
如果在编制索引期间无法做到这一点,您可能需要添加第二个技巧。可以 sort by a function query 而不是字段。因此,您需要构建一个函数查询表达式(可能至少使用 if 和 ms)来表示您的提升条件。
您可能有一些挑战代表您的 2015/2016 年作为条件。如果它是一个日期,您可以使用 date math 创建一个一致的向下舍入到一年 (NOW/YEAR)。
我会先做一个更简单的问题,将 重要 项目推到顶部,仍然按日期排序。只是为了测试我的逻辑是否有效。 If/once配合函数和排序分页,特殊日期可以加入计算。