【发布时间】:2014-04-07 21:45:59
【问题描述】:
我在弄清楚如何制定 solr 查询以动态提升某些文档并将不同的排序机制应用于其余文档时遇到了问题。为了更清楚,请考虑以下文档。
<doc>
<field name="docId">1</field>
<field name="sales">33</field>
<field name="price">10</field>
</doc>
<doc>
<field name="docId">2</field>
<field name="sales">44</field>
<field name="price">20</field>
</doc>
<doc>
<field name="docId">3</field>
<field name="sales">55</field>
<field name="price">30</field>
</doc>
<doc>
<field name="docId">4</field>
<field name="sales">22</field>
<field name="price">50</field>
</doc>
<doc>
<field name="docId">5</field>
<field name="sales">11</field>
<field name="price">5</field>
</doc>
<doc>
<field name="docId">6</field>
<field name="sales">1</field>
<field name="price">4</field>
</doc>
我的目标是选择一款销量最好的产品,并将其作为第一款产品展示。然后选择一个价格最低的产品并显示为第二个,最后按价格升序对其余文档进行排序,所以我的最终结果如下所示:
<doc>
<field name="docId">3</field><!-- Product with the highest amount of sales -->
</doc>
<doc>
<field name="docId">6</field><!-- Product with the lowest price -->
</doc>
<!-- The rest sorted by price asc -->
<doc>
<field name="docId">5</field>
</doc>
<doc>
<field name="docId">4</field>
</doc>
<doc>
<field name="docId">1</field>
</doc>
<doc>
<field name="docId">2</field>
</doc>
一开始我考虑使用QueryElevation 组件,但它只支持静态数据,我需要能够更改价格范围并应用相同的排序逻辑。
我开始查看solr function query,尤其是“max(sales,0) desc”可以解决我的问题,但我找不到限制排序结果并将它们合并在一起的方法。
也许我正在尝试通过一个查询来实现根本不可能的事情,但在我决定放弃之前,我想问一下,如果你们有想法,如何解决这个问题?
我也找到了这个answer,但它没有详细介绍解决方案。
提前致谢!
【问题讨论】:
-
老实说,我不会依赖 Solr 来做到这一点。我会得到我的结果集,然后自己提取两个特殊情况。或单独查询。您也许可以编写自定义排序功能以在 Solr 中工作,但这会带来更多麻烦。
-
那是我的另一个选择。查询必须提升的文档并在应用程序级别合并结果。太糟糕了,使用 solr 并不完全可能。
-
您使用的是哪个版本的 Solr?
-
来自solr dashboard "4.6.1 1560866 - mark - 2014-01-23 20:21:50",所以比较新鲜。
-
我们目前正在使用多个查询来实现这一点,对自己如何在 1 个查询中做到这一点非常感兴趣。
标签: java sorting solr lucene elevation