我在框架查询中使用OR,逻辑运算符时遇到这些问题。我不想增加maxBooleanClause值。还有其他选择吗?我的OR范围可以达到2百万。我宁愿想要超过maxBooleanClause的范围而不是solr分割查询,&最后合并所有子查询。这种事情有可能吗?或者,如果你们中的任何一个人可以建议一些更好的技术来做到这一点。
我想绘制一个图表,其中用户提供一些日期范围,例如2013-03-01至2013-06-01之间为访问该应用的所有访问者提供了帮助。这里我想做一个查询,它是所有唯一id的OR。例如
uniqueId:(1001 OR 1003 OR 1009 OR ........ OR 102467)
非常感谢帮助。
答案 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