我需要在Lucene索引中查找具有两个基本标准的项目: 1.匹配一个名为'relation'的特定字符串 2.属于权利'授权组'的列表
权利组定义该组成员可以访问的项目子集,非常类似于授权角色。
Lucene索引中的所有文档都有“关系”字段,为简单起见,还有一个或多个“grant-group”字段。
因此,例如,用户可以搜索“foobar”,并且该用户可以是组a,b,c的成员。我们说,foobar有赠款组a,p,q,s
查询基本上是“匹配'foobar'AND(或OR b OR c)。
这应该根据Lucene文档工作。
我的问题是:你可以用布尔查询的第二部分走多远,即'AND'之后的部分?问的原因是:我即将进行一项小型可行性研究,部分要求是需要在“OR”条款中支持潜在的多个组。可能多达200或300组。
会有明显的性能下降吗?
感谢。
答案 0 :(得分:3)
无论你做什么,都应该衡量。我想你可能应该对200-300组感到满意。我认为BooleanQuery中子句的默认限制是1024,但也可以更改。
如果您使用Solr,而不是直接使用Lucene,那么我建议将grant-group部分作为filterQuery,以便可以缓存它。
答案 1 :(得分:1)
从此overview of lucene performance:
换句话说:对于标准析取(OR'd)查询,子句的数量并不会真正影响性能,除非有更多文档可能匹配。
正如Avi所说,你将达到1024条款的限制。
答案 2 :(得分:0)
我不确定你可以在OR中指定多少元素,也许你应该做一个简单的概念验证,看看它是如何工作的。
除此之外,如果您使用Solr,我不会改变原始查询以实现您的要求(它会影响匹配文档的评分),而宁愿使用'fq'参数(参见Filter Query):< / p>