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.}

至此,已经可以简单的实现分组去重统计的功能了,如果业务比较复杂,例如像报表查询,以及一些特定的统计求和功能,这个就可能需要自己写了

相关推荐