上周在使用范围搜索时又遇到问题,程序抛出TooManyClauses exception。后来才发现lucene将范围搜索转化为精确匹配,每个匹配对应一个clause,所以如果你的范围如果包含超过1024个索引值,程序就会抛错
由此想到3种方案
1)
既然lucene限制了clause的个数,那么可以通过
BooleanQuery.setMaxClauseCount(Integer.MAX_VALUE)
改变限制,这个可以解决问题,但有隐患,如果某个范围的索引特别多,内存会有爆掉的危险。
2)根据应用修改索引
比如你有一个范围是视频观看数量(viewedcount) 1000-10000,那么你可以将这个范围内的所有的视频定为一个值(viewedcountlevel),也就是应用的每个搜索范围定为一个值,一个应用了不起10个范围,那么对范围档次建索引,到时候搜的根据 viewedcountlevel而不是viewedcount,将范围搜索以应用的角度转化为精确搜
3)使用filter
比如产生一个RangeFilter
if(advancedSearchVO.getViewedRank()>0)...{
if(advancedSearchVO.getViewedRank()==1)...{
returnnewRangeFilter("viewedcount","0000000000",
"0000000100",true,true);
}elseif(advancedSearchVO.getViewedRank()==2)...{
returnnewRangeFilter("viewedcount","0000000100",
"0000001000",true,true);
}elseif(advancedSearchVO.getViewedRank()==3)...{
returnnewRangeFilter("viewedcount","0000001000",
"0000010000",true,true);
}elseif(advancedSearchVO.getViewedRank()==4)...{
returnnewRangeFilter("viewedcount","0000010000",
"0150000000",true,true);
}
}
再使用
IndexSearch.search(Queryquery,Filterfilter),
个人比较喜欢最后一种方案,第一种有潜在的危险,第二种又有些脆弱(索引受应用影响大,不稳定),最后一种比较折中一点
前面所说的咚咚确实解决了一个filter的问题,如果你有多个范围搜索,也就是说通常你需要多个filter, filter如何嵌套?
首先建立一个filterlist
publicListbuildFilterList(ISearchVOsearchVO)...{
ListfilterList=newArrayList();
..........................
if(advancedSearchVO.getViewedRank()>0)...{
if(advancedSearchVO.getViewedRank()==1)...{
filterList.add(newRangeFilter("viewedcount","0000000000",
"0000000100",true,true));
}elseif(advancedSearchVO.getViewedRank()==2)...{
filterList.add(newRangeFilter("viewedcount","0000000100",
"0000001000",true,true));
}elseif(advancedSearchVO.getViewedRank()==3)...{
filterList.add(newRangeFilter("viewedcount","0000001000",
"0000010000",true,true));
}elseif(advancedSearchVO.getViewedRank()==4)...{
filterList.add(newRangeFilter("viewedcount","0000010000",
"0150000000",true,true));
}
}
...........................
returnfilterList;
}
然后嵌套
publicQuerybuildFilteredQuery(Listfilterlist,Queryquery)...{
if(filterlist==null||filterlist.size()<1)...{
returnquery;
}
FilteredQueryfilteredQuery=null;
for(inti=0;i<filterlist.size();i++)...{
if(i==0)...{
filteredQuery=newFilteredQuery(query,(Filter)filterlist
.get(i));
}else...{
filteredQuery=newFilteredQuery(filteredQuery,
(Filter)filterlist.get(i));
}
}
returnfilteredQuery;
}
最后
query=buildQuery();
。。。。
query=buildFilteredQuery(this.buildFilterList(searchVO),query);
Hitshits=searcher.search(query,sort);
。。。。
分享到:
相关推荐
lucene.NET 中文分词 高亮 lucene.NET 中文分词 高亮 lucene.NET 中文分词 高亮 lucene.NET 中文分词 高亮
c#下实现Lucene时间区间查询匹配。主要还是对Lucene查循对像Query的实现
lucene 3.0 API中文帮助,学习的人懂得的
lucene 搜索中文文档,写的比较详细
lucene3.6 搜索例子
赠送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实现全文搜索,支持英文、模糊和智能查询
lucene 高级搜索项目 附件搜索 附件内容搜索 全文搜索
基于Lucene的搜索引擎在Struts中的应用.pdf基于Lucene的搜索引擎在Struts中的应用.pdf基于Lucene的搜索引擎在Struts中的应用.pdf基于Lucene的搜索引擎在Struts中的应用.pdf基于Lucene的搜索引擎在Struts中的应用.pdf
来自“猎图网 www.richmap.cn”基于IKAnalyzer分词算法的准商业化Lucene中文分词器。 1. 正向全切分算法,42万... 对未知词汇采用自识别结合二元切分算法,确保搜索召回率 (使用方法请参考IKAnalyzer V1.1版)
基于Lucene的搜索策略研究
基于Lucene的搜索引擎的研究与应用基于Lucene的搜索引擎的研究与应用
Lucene是一个高性能、可伸缩的信息搜索(IR)库。目前最新版本是4.3.1. 它可以为你的应用程序添加索引和搜索能力。Lucene是用java实现的、成熟的开源项目,是著名的Apache Jakarta大家庭的一员,并且基于Apache软件...
lucene 近实时搜索 很清楚的解释了关于lucene近实时搜索的代码。很值得学习
lucene3.0.3搜索的使用示例lucene3.0.3搜索的使用示例lucene3.0.3搜索的使用示例
lucene实例lucene实例lucene实例lucene实例lucene实例lucene实例lucene实例lucene实例lucene实例
Lucene 实时搜索,视频详解,带课程文档,Lucene 实时搜索
07.Lucene搜索实战1 共4页 08.Lucene搜索实战2 共5页 09.Lucene搜索深入实战1 共5页 10.Lucene搜索深入实战2 共11页 11.Lucene搜索深入实战进阶1 共4页 12.Lucene搜索深入实战进阶2 共9页 13.Lucene搜索深入实战进阶...
lucene,lucene教程,lucene讲解。 为了对文档进行索引,Lucene 提供了五个基础的类 public class IndexWriter org.apache.lucene.index.IndexWriter public abstract class Directory org.apache.lucene.store....
利用lucene进行搜索,IndexSearcher是整个Lucene搜索查询相关信息的驱动引擎,在使IndexSearcher之前,需要构建IndexSearcher对象,Lucene提供了两种构建IndexSearcher对象的方式: 1、基于Directory对象构建; 2...