solr中的布尔子句异常太多

时间:2013-06-03 16:18:57

标签: solr solrj

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

我想绘制一个图表,其中用户提供一些日期范围,例如2013-03-01至2013-06-01之间为访问该应用的所有访问者提供了帮助。这里我想做一个查询,它是所有唯一id的OR。例如

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

非常感谢帮助。

2 个答案:

答案 0 :(得分:9)

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

我将走出困境并猜测这些条款是图形相关的,这是我看到这类查询最常见的地方。在这种情况下,你可能会在这里保持Solr的优势。

有时反转过滤器的逻辑是有意义的,而不是传递一大组值来过滤,将这些值索引到您正在搜索的文档上,以便稍后传递单个值。

例如,假设您有一个人的索引。并且说你想搜索与某个特定人物成为朋友的人。您可以生成所有朋友的ID列表,以过滤搜索。但是你会遇到类似于你在这里看到的问题:很多很多OR条款。

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

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

如果证明太繁重,您可能需要考虑针对图遍历更好地优化的不同技术。

答案 1 :(得分:1)

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

示例:

    MaterialSpinner spinner = (MaterialSpinner) findViewById(R.id.spCategory);
    spinner.setBackgroundResource(R.drawable.background);

默认分隔符为','所以所有被搜索的术语都可以作为term1,term2,term3等提供..

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