如何在 solr 查询中排序之前按分数限制

Posted

技术标签:

【中文标题】如何在 solr 查询中排序之前按分数限制【英文标题】:how can I limit by score before sorting in a solr query 【发布时间】:2011-05-21 21:37:37 【问题描述】:

我正在搜索“产品文档”。换句话说,我的 solr 文档是产品记录。我想说的是查询的前 50 个匹配产品。然后我希望能够按名称或价格对前 50 个评分文档进行排序。我没有看到太多关于如何做到这一点,因为按分数排序,然后按名称或价格并没有真正的帮助,因为分数是浮动的。

我不介意我是否可以将分数映射到范围(例如 8.0-8.99 的分数将进入 8 桶分数),然后按范围排序,然后按名称排序,但因为基本上得分没有标准化,这仍然会使事情变得更难。

Tl;dr 如何在排序前从 solr 结果集中排除低分文档?

【问题讨论】:

【参考方案1】:

您可以使用frange 来实现这一点,只要您不想按分数排序(在这种情况下,我想您可以只在客户端进行过滤)。

您的查询将类似于以下内容:

q=!frange l=5query($qq)&qq=[awesome product]&sort=price asc

将 q-frange-parameter 中的 l 参数设置为您想要过滤分数的下限,并将 qq 参数替换为您的用户查询。

【讨论】:

谢谢,因为我可以从第一次单独按分数排序显示结果时得到一个合理的范围,这很好!【参考方案2】:

正如 Karl Johansson 所观察到的,您可以在客户端进行过滤:加载响应的前 50 行(按分数 desc 排序),然后在 JS 中操作它们。

jQuery DataTables plugin 非常适合这类事情:排序、多列排序、动态过滤等——而且只有 50 行,它也非常快,因此用户可以“玩”排序和过滤,直到他们找到他们想要的。

【讨论】:

【参考方案3】:

我不认为你可以简单地

从 排序前的solr结果集

因为相关性分数仅对搜索查询和结果文档列表的给定组合有意义。 IE。分数仅在给定搜索中有意义,您不能为所有搜索设置某个阈值。

如果您使用 Java(或 php),您可以获得前 50 个文档,然后用您的编程语言重新排序此列表,但我认为您不能仅使用 SOLR。

无论如何,我建议您不要走这条从 SOLR 重新排序结果的路线,因为它只会让用户感到困惑。人们期望搜索结果像谷歌(和大多数其他搜索引擎)一样,结果以某种形式的 TFIDF 排名返回。

话虽如此,您可以使用其他一些标准来分隔具有相同相关性分数的文档,方法是根据价格范围添加index-time boost 因子。

我建议您充分利用 SOLR 的优势并使用方面。在左侧提供价格范围方面(如 Ebay、Amazon 等)和/或产品类别方面等。如果用户需要,还提供“排序”小部件以允许按产品名称对结果进行排序它。

[编辑] 这个问题也可能有用:

Digg-like search result ranking with Lucene / Solr?

【讨论】:

以上是关于如何在 solr 查询中排序之前按分数限制的主要内容,如果未能解决你的问题,请参考以下文章

Solr - 如何按地理空间距离排序并返回距离?

solr 排序与文档分数计算

solr如何区间查询

如何标准化 solr/lucene 分数?

Python Elasticsearch DSL:如何按分数降序排序?

你如何告诉 Mongo 在限制结果之前对集合进行排序?