首页->FAQ->显示文章
译自:http://wiki.apache.org/lucene-java/LuceneFAQ#Why_am_I_getting_a_TooManyClauses_exception.3F
下面的几种类型的查询在搜索前会被展开:RangeQuery,PrefixQuery,WildcardQuery,FuzzyQuery。例如,如果索引的文档包含词“car”和“cars”,那么查询“ca*”在搜索前会被展开为“car OR cars”。这些词的数量默认限制为1024。这里有几种方法可以避免TooManyClauses异常:
- 使用过滤器代替引发意外的查询条件。例如,用一个RangeFilter代替用于日期字段的RangeQuery,则永远不会抛出TooManyClauses异常──你甚至可以使用ConstantScoreRangeQuery来把你的RangeFilter当作一个查询执行。注意,过滤器第一次运行比查询慢,所以你应该用CachingWrapperFilter缓存他们。要用过滤器代替由QueryParser生成的查询,可以通过派生QueryParser,覆盖适当的方法返回你的查询的ConstantScore版本即可。
- 使用BooleanQuery.setMaxClauseCount()方法增大词数量的限制数。注意,这会展开更多的词,增大搜索的内存需求。要完全取消限制,可以使用BooleanQuery.setMaxClauseCount(Integer.MAX_VALUE)。
- 对于过于精确的字段有一个特定的解决方案,可以通过降低数据精确度的方法,大幅减少索引中词的数目。例如,DateField类的精度是微秒,通常这是不必要的。反之你可以把日期存为"yyyymmddHHMM"格式,甚至可能不要小时和分钟,如果你不需要他们(Lucene 1.9版本的新DataTools类可以简化这一操作)。
所属分类:
[lucene]
[Java]
tag:
异常,
查询展开,
过滤器,
tinyfool发布于2009年10月14日 16:10