拆分SOLR fq过滤查询

时间:2014-08-27 20:04:38

标签: solr lucene

所以我有一个带有以下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个单独的查询之后,使用原始的非拆分查询获得相同的结果(返回相同的文档,使用相同的总数)

1 个答案:

答案 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)组中的术语。