solr 中的布尔子句异常过多

Posted

技术标签:

【中文标题】solr 中的布尔子句异常过多【英文标题】:Too many boolean clauses exception in solr 【发布时间】:2013-05-29 20:57:13 【问题描述】:

我在框架查询中使用 OR 逻辑运算符时遇到了这些问题。我不想增加 maxBooleanClause 值。除了这个还有其他选择吗。我的 OR 范围可以达到 2 百万。我宁愿希望超过 maxBooleanClause 的范围,而不是 solr 拆分查询,最后合并所有子查询。这类事情可能吗?或者如果你们中的任何人可以提出一些更好的技术来做到这一点。

我想绘制一个图表,其中用户提供了一些日期范围,例如在 2013-03-01 到 2013-06-01 之间提供所有访问该应用程序的访问者。在这里,我想进行一个查询,它是所有唯一 ID 的 OR。例如

      uniqueId:(1001 OR 1003 OR 1009 OR ........ OR 102467)

感谢您的帮助。

【问题讨论】:

你需要数百万个逻辑表达式做什么?! 您能描述一下您的问题吗? Solr 用于搜索。使用不同的工具或解决方法可能会更好地解决您的问题。 @cheffe ,John :: 我更新了问题 【参考方案1】:

Solr 强加了maxBooleanClause 正是因为这是超出其最佳位置的东西。最终,如果您需要数百万次搜索,那么您将需要在 Solr 之外进行自己的分发和聚合。

我将不顾一切地猜测这些子句与图形相关,这是我看到这类查询最常见的地方。在这种情况下,您可能会在某种程度上保持 Solr 的优势。

有时反转过滤器的逻辑是有意义的,而不是传递大量值作为过滤依据,而是将这些值索引到您正在搜索的文档中,以便稍后传递单个值。

例如,假设您有一个人员索引。并假设您想搜索与某个特定人成为朋友的人。您可以生成他们所有朋友的 ID 列表以过滤您的搜索。但是您会遇到与您在此处看到的类似的问题:大量的 OR 子句。

或者,您可以将每个人的朋友列表索引到 Solr。现在您将拥有一个包含数千个值的字段,但您的查询过滤器将只有一个值:您过滤搜索所依据的网络的人员的 ID。

就搜索机制而言,这更符合 Solr 的优势。但是,这是有代价的。您需要自己管理非规范化,并且可能对文档进行大量更新,或者在更新图表时遇到一些延迟。

如果这被证明过于繁琐,您可能需要考虑一种更好地优化图遍历的不同技术。

【讨论】:

Solr 中没有替代方案,以便应用(例如)IN 子句吗?像 IN (1,2,3,4,...,n)...谢谢【参考方案2】:

您还可以使用更合适的查询解析器,例如 TermQueryParser,它更擅长处理大量 OR 子句。

例子:

!terms f=uniqueId1000,1001,10002,10003

默认分隔符是'',所以所有被搜索的词可以是term1、term2、term3等等。

更多详情:https://cwiki.apache.org/confluence/display/solr/Other+Parsers#OtherParsers-TermsQueryParser

【讨论】:

术语查询不是解决方案,因为它在功能上类似于 OR 子句。

以上是关于solr 中的布尔子句异常过多的主要内容,如果未能解决你的问题,请参考以下文章

Python文件操作:finally子句的使用

在 where 子句中使用集合 sql 时的布尔值

EXISTS 和 IN 的区别

Oracle Or子句

Oracle Or子句

通过添加嵌入在 PL-SQL(Oracle 函数)中的 select 子句来处理异常