在我的测试中,当我试图从一个由termquery和一个通配符查询组成的布尔查询中获取命中时,我突然遇到了Too Many Clauses异常.
我在网上搜索,并在找到的资源上建议增加BooleanQuery.SetMaxClauseCount().
这对我来说听起来很可疑..我该怎么办呢?我如何能够依赖这个新的幻数足以满足我的查询?在所有地狱破裂之前我能在多长时间内增加这个数字?
总的来说,我觉得这不是一个解决方案.必须有一个更深层次的问题..
查询是+ {+ companyName:mercedes + paintCode:a*},索引有~2.5M文档.
查询的paintCode:a* 部分是任何以“a”开头的paintCode 的前缀查询。这就是你的目标吗?
Lucene 将前缀查询扩展为布尔查询,其中包含与前缀匹配的所有可能的术语。在你的例子中,显然有超过 1024 个可能的paintCode以“a”开头的 s。
如果您觉得前缀查询毫无用处,那么您就离事实不远了。
我建议您更改索引方案以避免使用前缀查询。我不确定您想通过示例实现什么目的,但如果您想按首字母搜索绘制代码,请创建一个 PaintCodeFirstLetter 字段并按该字段进行搜索。
如果您绝望并愿意接受部分结果,您可以从源代码构建您自己的 Lucene 版本。PrefixQuery.java您需要对和MultiTermQuery.java下的文件进行更改org/apache/lucene/search。在rewrite两个类的方法中,更改行
query.add(tq, BooleanClause.Occur.SHOULD); // add to query
Run Code Online (Sandbox Code Playgroud)
到
try {
query.add(tq, BooleanClause.Occur.SHOULD); // add to query
} catch (TooManyClauses e) {
break;
}
Run Code Online (Sandbox Code Playgroud)
我为自己的项目做了这个并且它有效。
如果你真的不喜欢改变 Lucene 的想法,你可以编写你自己的 PrefixQuery 变体和你自己的 QueryParser,但我认为这并没有好多少。