lucene的分组的功能
lucene在4.x之前,没有实现分组的功能,如果业务中有需要分组的功能,那么必须的借助第三方的提供的插件,来实现分组,例如Bobo-browse,或者,自己用lucene写分组功能,笔者个人觉得用第三方的分组插件,虽说功能强大,但是比较繁琐,自己写的话,可以实现,但是效率方面却不是很好,在4.x之后,lucene已经自己实现分组功能提供了分组jar包
Java代码复制代码收藏代码
1.lucene-grouping-4.2.0.jar
,利用此类可以效率很高完成分组去重功能。下面不在啰嗦,直接贴出代码,如有问题,欢迎指正!
Java代码复制代码收藏代码
1.publicstaticList<HashMap<String,String>>testGroup(StringindexPath,StringgroupField,StringsumField){
2.List<HashMap<String,String>>map=newArrayList<HashMap<String,String>>();
3.Directoryd1=null;
4.IndexReaderread1=null;
5.try{
6.d1=FSDirectory.open(newFile(indexPath));//磁盘索引
7.read1=DirectoryReader.open(d1);//打开流
8.IndexSearchersear=newIndexSearcher(newMultiReader(read1));//MultiReader此类可以多份索引的读入
9.//但是得保证各个索引的字段结构一致
10.GroupingSearchgSearch=newGroupingSearch(groupField);//分组查询按照place分组
11.Queryq=newWildcardQuery(newTerm(groupField,"*"));//查询所有数据
12.TopGroupst=gSearch.search(sear,q,0,Integer.MAX_VALUE);//设置返回数据
13.GroupDocs[]g=t.groups;//获取分组总数
14.System.out.println("总数据数"+t.totalHitCount);
15.System.out.println("去重复后的数量:"+g.length);
16.for(inti=0;i<g.length;i++){
17.ScoreDoc[]sd=g[i].scoreDocs;
18.Stringstr=sear.doc(sd[0].doc).get(groupField);
19.inttotal=sumcount(str,groupField,sumField,sear);
20.//System.out.println("place:"+str+"===>"+"个数:"+g[i].totalHits+);
21.System.out.println("place:"+str+"===>"+"个数:"+g[i].totalHits);
22.HashMap<String,String>m=newHashMap<String,String>();
23.m.put("word",str);
24.m.put("wx_count",total+"");
25.m.put("wx_total","10000");
26.map.add(m);
27.}
28.read1.close();//关闭资源
29.d1.close();
30.}catch(Exceptione){
31.e.printStackTrace();
32.}
33.returnmap;
34.}
至此,已经可以简单的实现分组去重统计的功能了,如果业务比较复杂,例如像报表查询,以及一些特定的统计求和功能,这个就可能需要自己写了