使用Lucene:如果我进行前缀搜索,为什么会出现Too Many Clauses错误?

时间:2008-08-12 06:04:49

标签: exception lucene

我有一个应用程序正在进行前缀搜索一段时间。最近索引规模增加了,结果发现一些前缀太多了,无法让lucene处理。它不断给我一个Too Many Clauses错误,这非常令人沮丧,因为我一直在查看我的JAR并确认所包含的代码中没有一个实际使用了布尔查询。

为什么不抛出像Too Many Hits例外的东西?为什么增加布尔查询的静态max子句整数实际上会使这个错误消失,当我肯定只使用前缀查询?查询是如何运行的,我不理解;他们秘密成为布尔查询吗?

3 个答案:

答案 0 :(得分:5)

我以前打过这个。它涉及到这样一个事实:当你调用Query.rewrite()

时,lucene在封面下将许多(所有?)事物转换为布尔查询

来自:http://lucene.apache.org/java/2_2_0/api/org/apache/lucene/search/Query.html#rewrite(org.apache.lucene.index.IndexReader)

public Query rewrite(IndexReader reader)
              throws IOException

    Expert: called to re-write queries into primitive queries.
            For example, a PrefixQuery will be rewritten into a
            BooleanQuery that consists of TermQuerys.

    Throws:
        IOException

答案 1 :(得分:3)

TooManyClauses的API参考页面显示PrefixQuery,FuzzyQuery,WildcardQuery和RangeQuery以这种方式扩展(进入BooleanQuery)。由于它在API引用中,因此应该是用户可以依赖的行为。 Lucene没有对命中数量设置任意限制(除了文档ID是int),因此“太多命中”异常可能没有意义。也许PrefixQuery.rewrite(IndexReader)应该捕获TooManyClauses并抛出“太多前缀”异常,但是现在它不会那样。

顺便说一下,按前缀搜索的另一种方法是使用PrefixFilter。使用它过滤查询或使用ConstantScoreQuery包装过滤器。

答案 2 :(得分:0)

当运行前缀查询时,Lucene会在其“字典”中搜索与查询匹配的所有字词。如果超过1024(默认情况下)匹配,则抛出TooManyClauses-Exception。

您可以调用BooleanQuery.setMaxClauseCount来增加每个BooleanQuery允许的最大子句数。