`

有关Lucene的问题(5):Lucene中的TooManyClause异常

阅读更多

为什么会产生这个异常:

使用Lucene检索过程中如果用到RangeQuery,PrefixQuery,WildcardQuery,FuzzyQuery这四种Query,可能会产生TooManyClauses异常。为什么会产生这个异常呢?举例说明:

以RangeQuery为例,如果日期范围为19990101到20091231,在索引文件中有19990102,19990103等等这些日期词组,那么RangeQuery会被扩展成“19990102 OR 19990103”,成了2个子句。可以想象,如果索引文件里面在这个时间段内的日期有很多,那么就会产生很多子句。

PrefixQuery等也是同样的道理,如查询词为“法*”,如果索引文件中有“法律”、“法场”、“法医”、“法典”等等,这个Query就会被扩展成“法律 OR 法场 OR 法医 OR 法典”,或许会更多更多。

而为了节省内存,Lucene默认将子句数目限制为1024,如果超出限制,就会抛出TooManyClauses异常。

怎么解决这个问题呢,Lucene提供了三种方法:

(1) 使用filter替代Query,当然这是以牺牲查询速度为代价的,不过可以通过缓存的方式缓解这个问题。仍然以前面RangeQuery为例,可以使用RangeFilter来替代RangeQuery,如下:
之前的代码:

BooleanQuery simpleQuery = new BooleanQuery();
Term dateLower = new Term("publishDate", startYear + "0101");
Term dateUpper = new Term("publishDate", endYear + "1231");
RangeQuery dateQuery = new RangeQuery(dateLower, dateUpper, true);
simpleQuery.add(dateQuery, Occur.MUST);

之后的代码:

BooleanQuery simpleQuery = new BooleanQuery();
RangeFilter dateFilter = new RangeFilter("publishDate", startYear + "0101", endYear + "1231", true, true);
FilteredQuery filteredQuery = new FilteredQuery(simpleQuery, dateFilter);

(2) 通过BooleanQuery.setMaxClauseCount(10240)来限制数目。这样会加大内存的消耗。使用BooleanQuery.setMaxClauseCount(Integer.MAX_VALUE),可以完全去掉这个限制。

(3) 对于范围查询,可以尽可能的降低精度,比如如果查询不需要精确到月份与日期,只需要精确到年,据说可以使用DateTools这个类可以很简单解决时间转化问题,本人并没有尝试。

分享到:
评论
2 楼 forfuture1978 2010-05-18  
yangfuchao418 写道
顶,希望楼主有写完的勇气。虽然暂时不搞这个了

谢谢,一定会把本系列文章写完
1 楼 yangfuchao418 2010-05-18  
顶,希望楼主有写完的勇气。虽然暂时不搞这个了

相关推荐

    lucene-core-7.7.0-API文档-中文版.zip

    赠送jar包:lucene-core-7.7.0.jar; 赠送原API文档:lucene-core-7.7.0-javadoc.jar; 赠送源代码:lucene-core-7.7.0-sources.jar; 赠送Maven依赖信息文件:lucene-core-7.7.0.pom; 包含翻译后的API文档:lucene...

    lucene5.X与lucene3.60的版本差异

    Lucene 5.x版本相对于3.6.0有显著的改进,不仅优化了API设计,提高了性能,还修复了许多已知问题。开发者在升级到新版本时,需要注意API的变更,以避免兼容性问题,并充分利用新版本带来的优势。通过理解这些变化,...

    lucene-sandbox-6.6.0-API文档-中文版.zip

    赠送jar包:lucene-sandbox-6.6.0.jar; 赠送原API文档:lucene-sandbox-6.6.0-javadoc.jar; 赠送源代码:lucene-sandbox-6.6.0-sources.jar; 赠送Maven依赖信息文件:lucene-sandbox-6.6.0.pom; 包含翻译后的API...

    Lucene.Heritrix:开发自己的搜索引擎(第2版)

    5. **查询处理**:介绍如何使用Lucene的QueryParser构建查询,执行查询,并根据搜索结果进行排序。 6. **优化与性能提升**:讨论如何优化索引性能,如使用多线程索引,内存管理,以及如何调整索引和搜索参数以提高...

    IKAnalyzer中文分词支持lucene6.5.0版本

    由于林良益先生在2012之后未对IKAnalyzer进行更新,后续lucene分词接口发生变化,导致不可使用,所以此jar包支持lucene6.0以上版本

    lucene-core-7.2.1-API文档-中文版.zip

    赠送jar包:lucene-core-7.2.1.jar; 赠送原API文档:lucene-core-7.2.1-javadoc.jar; 赠送源代码:lucene-core-7.2.1-sources.jar; 赠送Maven依赖信息文件:lucene-core-7.2.1.pom; 包含翻译后的API文档:lucene...

    Lucene 7.2.1 官方jar包

    - **文档(Document)**: 在Lucene中,文档是被索引的基本单位,可以包含多个字段(Field),如标题、内容等。 - **字段(Field)**: 字段是文档中的一个个单元,每个字段有特定的类型,如全文本、数值或日期。 - ...

    lucene-core-6.6.0-API文档-中文版.zip

    赠送jar包:lucene-core-6.6.0.jar; 赠送原API文档:lucene-core-6.6.0-javadoc.jar; 赠送源代码:lucene-core-6.6.0-sources.jar; 赠送Maven依赖信息文件:lucene-core-6.6.0.pom; 包含翻译后的API文档:lucene...

    详解SpringBoot+Lucene案例介绍

    * lucene-core:Lucene的核心包,提供了基本的索引和搜索功能。 * lucene-queryparser:提供了查询解析的功能,用于将用户输入的查询语句转换为Lucene的查询对象。 * lucene-analyzers-common:提供了基础的分词器,...

    中英文版 lucene in action (pdf 版,附随书源码)

    《Lucene in Action》是一本深受开发者欢迎的书籍,它深入浅出地介绍了Apache Lucene这个全文搜索引擎库的使用和实现原理。...通过阅读和实践,你可以掌握Lucene的核心技术,并且有能力解决实际开发中的各种问题。

    jieba-lucene-analiysis:jieba的lucene中文分析器和令牌生成器

    这个项目的主要目的是解决在Lucene中对中文文本进行索引和搜索时的效率和准确性问题。 1. **jieba分词库**: Jieba是一个开源的Python库,专门用于中文分词。它提供了精确模式、全模式和搜索引擎模式等不同的分词...

    lucene-highlighter-6.6.0-API文档-中文版.zip

    赠送jar包:lucene-highlighter-6.6.0.jar; 赠送原API文档:lucene-highlighter-6.6.0-javadoc.jar; 赠送源代码:lucene-highlighter-6.6.0-sources.jar; 赠送Maven依赖信息文件:lucene-highlighter-6.6.0.pom;...

    lucene-suggest-7.7.0-API文档-中文版.zip

    赠送jar包:lucene-suggest-7.7.0.jar; 赠送原API文档:lucene-suggest-7.7.0-javadoc.jar; 赠送源代码:lucene-suggest-7.7.0-sources.jar; 赠送Maven依赖信息文件:lucene-suggest-7.7.0.pom; 包含翻译后的API...

    lucene-grouping-6.6.0-API文档-中文版.zip

    赠送jar包:lucene-grouping-6.6.0.jar; 赠送原API文档:lucene-grouping-6.6.0-javadoc.jar; 赠送源代码:lucene-grouping-6.6.0-sources.jar; 赠送Maven依赖信息文件:lucene-grouping-6.6.0.pom; 包含翻译后...

    IKAnalyzer 支持高版本最新Lucene 5.x、6.x、7.x

    在给定的标题和描述中,我们看到IKAnalyzer已经更新以支持Lucene的高版本,包括5.x、6.x以及最新的7.3.1版本,这表明它持续跟进了Lucene的发展,确保与主流搜索引擎框架的兼容性。 1. **IKAnalyzer详解**: - IK...

    lucene.NET 中文分词

    在Lucene.NET中,为了支持中文分词,通常需要结合第三方分词器,如IK Analyzer、HanLP、jieba.NET等。这些分词器具备丰富的词汇库和优秀的分词算法,能有效地对中文文本进行拆分。 - **IK Analyzer**:是一个开源的...

    lucene-memory-6.6.0-API文档-中文版.zip

    赠送jar包:lucene-memory-6.6.0.jar; 赠送原API文档:lucene-memory-6.6.0-javadoc.jar; 赠送源代码:lucene-memory-6.6.0-sources.jar; 赠送Maven依赖信息文件:lucene-memory-6.6.0.pom; 包含翻译后的API文档...

    lucene实现过程中存在的问题

    Lucene作为一款强大的搜索引擎库,在实际应用中确实会遇到一些问题,如平台异常、查询异常、显示问题以及写锁异常等。针对这些问题,我们可以通过一系列措施来进行预防和解决,如正确使用查询语法、优化显示逻辑、...

    lucene-join-7.2.1-API文档-中英对照版.zip

    赠送jar包:lucene-join-7.2.1.jar; 赠送原API文档:lucene-join-7.2.1-javadoc.jar; 赠送源代码:lucene-join-7.2.1-sources.jar; 赠送Maven依赖信息文件:lucene-join-7.2.1.pom; 包含翻译后的API文档:lucene...

    lucene-suggest-6.6.0-API文档-中文版.zip

    赠送jar包:lucene-suggest-6.6.0.jar; 赠送原API文档:lucene-suggest-6.6.0-javadoc.jar; 赠送源代码:lucene-suggest-6.6.0-sources.jar; 赠送Maven依赖信息文件:lucene-suggest-6.6.0.pom; 包含翻译后的API...

Global site tag (gtag.js) - Google Analytics