所以我有一个带有以下fq过滤器参数的SOLR查询:
(field_name:(1 OR 2 OR 25 OR 33 OR 333 OR 32 OR ...... and 2000 other ORS))
所以Solr有这个最大布尔限制:
<maxBooleanClauses>1024</maxBooleanClauses>
因此我别无选择,只能拆分此查询并尝试合并拆分查询的结果。此外,我对结果进行了分页,因此我只对匹配的前10个文档以及所有结果的总数感兴趣。
问题是......搜索对象与field_name属性有一对多的关系。因此,solr文档可能有多个field_name值....现在在原始查询中,这将使用SOLR OR语句很好地解决....但是,如果我分离OR然后执行3个单独的查询,由于这个一对多关系,多个查询会返回某些文档。因此,我不能为每个查询添加numResult以获取实际的聚合numResult,而且返回的文档通常会被多个查询返回
如何解决这个难题,我怎样才能操作这个,以便在将其拆分为3个单独的查询之后,使用原始的非拆分查询获得相同的结果(返回相同的文档,使用相同的总数)
答案 0 :(得分:3)
一个简单的解决方案是修改schema.xml
并增加maxBooleanClauses
。
<maxBooleanClauses>4096</maxBooleanClauses>
如果由于某种原因您不想增加maxBooleanClauses
,您可以将术语组加入单个子句,以生成包含较少子句的单个查询。
例如,我们假设您的maxBooleanClauses
等于4.还假设您有以下查询:
1 OR 2 OR 3 OR 4 OR 5 OR 6 OR 7 OR 8 OR 9
首先,您可以删除OR
,因为Solr默认使用OR
。其次,将三个连续项的每个三元组合并为一个子句,以便将查询修改为:
(1 2 3) (4 5 6) (7 8 9)
原始过滤器查询等同于修改过的查询。要将x
- 长查询转换为等效(最多)y
- 长查询,请加入ceil(x/y)
组中的术语。