solr如何区间查询

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了solr如何区间查询相关的知识,希望对你有一定的参考价值。

参考技术A 般情况下使用[]设置范围,而[]表示的是闭区间,也就是包含端点值。
如果不希望包含端点值,就需要用到开区间,用大括号来限定。
但是对于半开区间,就无法设置了,在数学中常见的例子:
(0,1]或者[0,1)
如果都使用闭区间,端点值会重复计算,而都使用开区间,端点值又会被忽略。
在facet.date中有端点值如何处理的设置。但是对于直接用区间进行查询就无法设置了,只能在程序中人为保证区间分段的正确性了。

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

【中文标题】如何在 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高级查询Facet

树状数组实现区间修改+区间查询

树状数组的区间修改与单点查询与区间查询

线段树(单点修改+区间查询)&(区间修改+区间查询)

loj数列分块入门

树状数组的建树 单点修改 单点查询 区间修改 区间查询