2008-08-12 17 views
7

我有一个应用程序做了一段时间的前缀搜索。最近,索引尺寸增加了,结果证明一些前缀对lucene来说太多了。它不断抛出我一个Too Many Clauses错误,这是非常令人沮丧的,因为我一直在看我的JAR并确认所包含的代码实际上没有使用布尔查询。使用Lucene:如果我做了前缀搜索,为什么会出现太多的子句错误?

为什么它不会抛出像Too Many Hits异常之类的东西?为什么增加布尔查询的静态最大子句整数实际上使这个错误消失,当我肯定只使用前缀查询?对于我不了解的查询如何运行有一些基本的东西,他们是否秘密成为布尔查询?

回答

5

我以前就打过这个。它有一个事实,即Lucene的,在幕后,原来很多(所有?)事情到布尔查询,当你调用Query.rewrite()

从做: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

这个`Query.rewrite()`转换*总是*在查询被实际执行之前发生? (这似乎是合理的,查询需要在执行之前分解为原始查询。) – KajMagnus 2013-07-29 05:17:35

0

当运行一个前缀查询,Lucene搜索匹配查询的“词典”中的所有术语。如果超过1024个(默认)匹配,则引发TooManyClauses异常。

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

+0

这很有道理,但对我来说问题是我无法知道PrefixQuery实际上变成了一个布尔查询。 – dlamblin 2008-09-22 20:50:54

3

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

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

+0

`PrefixFilter`是否也扩展为布尔子句? (或者它以某种方式实施?) – KajMagnus 2013-07-29 05:52:54

相关问题