有关Lucene的问题(5):Lucene中的TooManyClause异常
来源:互联网 发布:mac图片ps 编辑:程序博客网 时间:2024/06/06 16:46
为什么会产生这个异常:
使用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这个类可以很简单解决时间转化问题,本人并没有尝试。
- 有关Lucene的问题(5):Lucene中的TooManyClause异常
- 有关Lucene的问题(5):Lucene中的TooManyClause异常
- 有关Lucene的问题(5):Lucene中的TooManyClause异常
- lucene 中的TooManyClause 异常
- [lucene异常]why am I getting a TooManyClause exception
- 有关Lucene的问题(6):Lucene的事务性
- 有关Lucene的问题(6):Lucene的事务性
- 有关Lucene的问题(6):Lucene的事务性
- 有关Lucene的问题:用Lucene构建实时索引
- 有关Lucene的问题:用Lucene构建实时索引
- Lucene中的异常
- lucene 抛出的异常
- 有关Lucene的问题(8):用Lucene构建实时索引的文档更新问题
- 有关Lucene的问题(8):用Lucene构建实时索引的文档更新问题
- 有关Lucene的问题(8):用Lucene构建实时索引的文档更新问题
- 有关Lucene的问题(8):用Lucene构建实时索引的文档更新问题
- 有关Lucene的问题(8):用Lucene构建实时索引的文档更新问题
- 有关Lucene的问题(3): 向量空间模型与Lucene的打分机制
- slice、substr、substring区别
- MissingNumber
- 数据结构学习笔记——递归(分而治之)
- java 中的线程
- python+selenium+pychar安装
- 有关Lucene的问题(5):Lucene中的TooManyClause异常
- 【找零钱问题】
- 简单工厂和工厂方法模式的区别
- java反射之基本概念
- 密码学简介
- eclipse和idea的一些区别
- 你觉得jQuery源码中有哪些写得好的地方?
- C语言 typedef 和 #define
- java基础之socket io理解