所以我有一个带有以下 fq 过滤器参数的 SOLR 查询:
(field_name:(1 OR 2 OR 25 OR 33 OR 333 OR 32 OR ...... and 2000 other ORS))
所以 Solr 有这个最大 bool 限制:
<maxBooleanClauses>1024</maxBooleanClauses>
因此,我别无选择,只能拆分此查询并尝试合并拆分查询的结果。此外,我正在对结果进行分页,因此我只对匹配的前 10 个文档以及所有结果的总数感兴趣。
问题是...搜索对象与 field_name 属性具有一对多关系。因此,一个 solr 文档可以有多个 field_name 值...现在在原始查询中,这一切都可以通过 SOLR OR 语句很好地解决...但是,如果我分离 OR 然后执行 3 个单独的查询,由于这个一对多关系,某些文档将通过多个查询返回。因此,我不能只为每个查询添加 numResult 来获取实际的聚合 numResult,而且返回的文档通常会由多个查询返回
如何解决这个困境,如何操作它,以便在将原始未拆分查询拆分为 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)< 组中
.
关于solr - 拆分 SOLR fq 过滤器查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25536025/