solr - 拆分 SOLR fq 过滤器查询

标签 solr lucene

所以我有一个带有以下 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/

相关文章:

java - 在 elasticsearch 中为 hinglish 创建自定义词干分析器

java - Lucene - 第一次应用程序错误

ruby-on-rails - 连接 Tomcat、Solr 和 sunspot_rails 之间的点

java - 如何获取Solr字段类型

php - Symfony2 中使用 Solr 的搜索框

java - Solrj 与 Solr Suggester

mysql - org.apache.solr.common.SolrException : Unable to create core

json - Docker - 在 Solr 核心中导入 Json 文档

solr 建议者不返回任何结果

java - ElasticSearch 中映射和类型之间的混淆