Lucene4.3.1 使用GroupingSearch对搜索结果进行分组

Package org.apache.lucene.search.grouping Description

这个模块可以对Lucene的搜索结果进行分组,指定的单值域被聚集到一起。比如,根据”author“域进行分组,“author”域值相同的的文档分成一个组。

进行分组的时候需要输入一些必要的信息:

1、groupField:根据这个域进行分组。比如,如果你使用“author”域进行分组,那么每一个组里面的书籍都是同一个作者。没有这个域的文档将被分到一个单独的组里面。

2、groupSort:组排序。

3、topNGroups:保留多少组。比如,10表示只保留前10组。

4、groupOffset:对排在前面的哪些分组组进行检索。比如,3表示返回7个组(假设opNGroups等于10)。在分页里面很有用,比如每页只显示5个组。

5、withinGroupSort:组内文档排序。注意:这里和groupSort的区别

6、withingroupOffset:对每一个分组里面的哪些排在前面的文档进行检索。


使用GroupingSearch 对搜索结果分组比较简单

GroupingSearch API文档介绍:

Convenience class to perform grouping in a non distributed environment.

非分布式环境下分组

WARNING: This API is experimental and might change in incompatible ways in the next release.

这里使用的是4.3.1版本

一些重要的方法:

 GroupingSearchsetCaching(int maxDocsToCache, boolean cacheScores) 
缓存
 GroupingSearchsetCachingInMB(double maxCacheRAMMB, boolean cacheScores) 
缓存第一次搜索结果,用于第二次搜索


 GroupingSearchsetGroupDocsLimit(int groupDocsLimit) 
指定每组返回的文档数,不指定时,默认返回一个文档
 GroupingSearchsetGroupSort(Sort groupSort) 
 指定分组排序

示例代码:

先看建索引的代码

import ...

/**
 * @author Mr_Tank_
 * 
 */
public class IndexHelper {
    private Document document;
    private Directory directory;
    private IndexWriter indexWriter;

    public Directory getDirectory(){
        directory=(directory==null)? new RAMDirectory():directory;
        return directory;
    }

    private IndexWriterConfig getConfig() {
        return new IndexWriterConfig(Version.LUCENE_43, new IKAnalyzer(true));
    }

    private IndexWriter getIndexWriter() {
        try {
            return new IndexWriter(getDirectory(), getConfig());
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    public IndexSearcher getIndexSearcher() throws IOException {
        return new IndexSearcher(DirectoryReader.open(getDirectory()));
    }

    /**
     * Create index for group test
     * @param author
     * @param content
     */
    public void createIndexForGroup(int id,String author,String content) {
        indexWriter = getIndexWriter();
        document = new Document();
        document.add(new IntField("id",id, Field.Store.YES));
        document.add(new StringField("author", author, Field.Store.YES));
        document.add(new TextField("content", content, Field.Store.YES));
        try {
            indexWriter.addDocument(document);
            indexWriter.commit();
            indexWriter.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2.分组:

public class GroupTest

public void group(IndexSearcher indexSearcher,String groupField,String content) throws IOException, ParseException {
        GroupingSearch groupingSearch = new GroupingSearch(groupField);
        groupingSearch.setGroupSort(new Sort(SortField.FIELD_SCORE));
        groupingSearch.setFillSortFields(true);
        groupingSearch.setCachingInMB(4.0, true);
        groupingSearch.setAllGroups(true);
        //groupingSearch.setAllGroupHeads(true);
        groupingSearch.setGroupDocsLimit(10);

        QueryParser parser = new QueryParser(Version.LUCENE_43, "content", new IKAnalyzer(true));
        Query query = parser.parse(content);

        TopGroups<BytesRef> result = groupingSearch.search(indexSearcher, query, 0, 1000);

        System.out.println("搜索命中数:" + result.totalHitCount);
        System.out.println("搜索结果分组数:" + result.groups.length);

        Document document;
        for (GroupDocs<BytesRef> groupDocs : result.groups) {
            System.out.println("分组:" + groupDocs.groupValue.utf8ToString());
            System.out.println("组内记录:" + groupDocs.totalHits);

            //System.out.println("groupDocs.scoreDocs.length:" + groupDocs.scoreDocs.length);
            for (ScoreDoc scoreDoc : groupDocs.scoreDocs) {
                System.out.println(indexSearcher.doc(scoreDoc.doc));
            }
        }
    }

3.简单的测试:

public static void main(String[] args) throws IOException, ParseException {
        IndexHelper indexHelper = new IndexHelper();
        indexHelper.createIndexForGroup(1,"红薯", "开源中国");
        indexHelper.createIndexForGroup(2,"红薯", "开源社区");
        indexHelper.createIndexForGroup(3,"红薯", "代码设计");
        indexHelper.createIndexForGroup(4,"红薯", "设计");
        indexHelper.createIndexForGroup(5,"觉先", "Lucene开发");
        indexHelper.createIndexForGroup(6,"觉先", "Lucene实战");
        indexHelper.createIndexForGroup(7,"觉先", "开源Lucene");
        indexHelper.createIndexForGroup(8,"觉先", "开源solr");

        indexHelper.createIndexForGroup(9,"散仙", "散仙开源Lucene");
        indexHelper.createIndexForGroup(10,"散仙", "散仙开源solr");
        indexHelper.createIndexForGroup(11,"散仙", "开源");
        GroupTest groupTest = new GroupTest();

        groupTest.group(indexHelper.getIndexSearcher(),"author", "开源");
    }
}

4.测试结果:

205356_DesV_593105.png


转载于:https://my.oschina.net/tanweijie/blog/195143

注:下文中的 *** 代表文件名中的组件名称。 # 包含: 中文-英文对照文档:【***-javadoc-API文档-中文(简体)-英语-对照版.zip】 jar包下载地址:【***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【***.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【***.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【***-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: 中文-英文对照文档,中英对照文档,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【***.jar中文文档.zip】,再解压其中的 【***-javadoc-API文档-中文(简体)版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·本文档为双语同时展示,一行原文、一行译文,可逐行对照,避免了原文/译文来回切换的麻烦; ·有原文可参照,不再担心翻译偏差误导; ·边学技术、边学英语。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值