使用lucene进行group操作

近来用lucene进行查询,需要对结果进行group操作,结果发现核心包里面没有提供这个功能。

如果在内存里面对结果再自己用代码实现的话效率太低。查询了一番文档,发现了lucene-grouping。

jar包位置:

<dependency>
    <groupId>org.apache.lucene</groupId>
    <artifactId>lucene-grouping</artifactId>
    <version>4.0.0</version>
</dependency>

使用这个包可以实现对搜索结果进行group操作


首先建立索引

private Document createDocument(String id, String tag_value,
                                 String score,String city,String time,
                                 String from,String type,String typeId,
                                 String gender,String birthday) {
    Document document = new Document();
    document.add(new TextField("userId", id, Field.Store.YES));
    document.add(new StringField("tagName", tag_value, Field.Store.YES));
    document.add(new StringField("tagScoreValue", score, Field.Store.YES));
    document.add(new StringField("usersCurrentCity", city, Field.Store.YES));
    document.add(new StringField("tagRelatedTime", time, Field.Store.YES));
    document.add(new StringField("dataFrom", from, Field.Store.YES));
    document.add(new StringField("dataType", type, Field.Store.YES));
    document.add(new StringField("dataId", typeId, Field.Store.YES));
    document.add(new StringField("gender", gender, Field.Store.YES));
    document.add(new StringField("birthday", birthday, Field.Store.YES));
    return document;
}


这是我的索引结构,测试用的。


下面是我的测试代码

public void testCustomSort() throws Exception {
    List<Document> docs = Arrays.asList(
            createDocument("1", "java", "55", "sz", "2015", "www.yuorfei.com", "blog", "0", "1", "1993"),
            createDocument("1", "php", "56", "sz", "2015", "www.yuorfei.com", "blog", "0", "1", "1993"),
            createDocument("2", "docker", "57", "sz", "2015", "www.yuorfei.com", "blog", "0", "1", "1993"),
            createDocument("2", "php", "55", "sz", "2015", "www.yuorfei.com", "blog", "0", "1", "1993"),
            createDocument("2", "java", "56", "sz", "2015", "www.yuorfei.com", "blog", "0", "1", "1993"),
            createDocument("3", "java", "10", "sz", "2015", "www.yuorfei.com", "blog", "0", "1", "1993"),
            createDocument("4", "javascript", "99", "sz", "2015", "www.yuorfei.com", "blog", "0", "1", "1993"),
            createDocument("4", "java", "99999", "szbjbj44444", "20154444", "www.yuorfei.com", "blog", "0", "1", "1993"));
    LuceneTool.writeDocument(indexDirectoryPath, docs);
 
    String groupField = "userId";
    String tagName="java,php";
 
    GroupingSearch groupingSearch = new GroupingSearch(groupField);
    groupingSearch.setFillSortFields(true);
    groupingSearch.setCachingInMB(4.0, true);
    groupingSearch.setAllGroups(true);
    groupingSearch.setGroupDocsLimit(10);
    TagRadarSearchBuilder tagRadarSearchBuilder = new TagRadarSearchBuilder();
    String[] tagNames = StringUtils.split(tagName, ",");
    tagRadarSearchBuilder.tagName(tagNames).sortedBy(TagRadarSortedCategory.SORTED_BY_TAG_SCORE_VALUE_DESC);
    FSDirectory dir = FSDirectory.open(new File(indexDirectoryPath));
    dir.setReadChunkSize(104857600);//100兆
    IndexReader reader = DirectoryReader.open(dir);
    IndexSearcher indexSearch = new IndexSearcher(reader);
    groupingSearch.setGroupSort(tagRadarSearchBuilder.getSort());
    groupingSearch.setSortWithinGroup(tagRadarSearchBuilder.getSort());
    TopGroups<BytesRef> result = groupingSearch.search(indexSearch, tagRadarSearchBuilder.getQuery(), 0, 1000);
    System.out.println("搜索命中数:" + result.totalHitCount);
    System.out.println("搜索结果分组数:" + result.groups.length);
    System.out.println("\n-------------------------\n");
    for (GroupDocs<BytesRef> groupDocs : result.groups) {
        System.out.println("分组用户id:" + groupDocs.groupValue.utf8ToString());
        System.out.println("组内记录数量:" + groupDocs.totalHits);
        for (ScoreDoc scoreDoc : groupDocs.scoreDocs) {
            System.out.println(indexSearch.doc(scoreDoc.doc));
        }
        System.out.println("\n-------------------------\n");
    }
}


最主要的核心的地方是:

GroupingSearch groupingSearch = new GroupingSearch(groupField);
groupingSearch.setGroupSort(tagRadarSearchBuilder.getSort());
groupingSearch.setSortWithinGroup(tagRadarSearchBuilder.getSort());
TopGroups<BytesRef> result = groupingSearch.search(indexSearch, tagRadarSearchBuilder.getQuery(), 0, 1000);


设置的排序方法,调用groupSearch的search进行搜索。

setGroupSort为组间排序

setSortWithinGroup为组内排序

这样就能简单的实现对lucene搜索结果进行group操作,效率非常高。


转载于:https://my.oschina.net/110NotFound/blog/665145

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
注:下文中的 *** 代表文件名中的组件名称。 # 包含: 中文-英文对照文档:【***-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、付费专栏及课程。

余额充值