最近在优化搜索服务,以前的搜索服务十分简单,现在需要增加查询结果分组统计的功能,以提高用户体验。
g了一番,有以下几个主要的实现方式:
1、利用search中的collect,自己实现一个collect输出分组统计结果;
2、一个开源的lucene插件bobo browser
3、lucnen3.2后有个grouping模块
最后我选择了grouping这个模块来实现
grouping模块有2种方法实现,2次遍历法和1次遍历法。1次遍历法是在lucene3.3之后才开始提供。
1次遍历法效率很高,但是需要在索引时添加特殊的标志:
To use the single-pass BlockGroupingCollector
, first, at indexing time, you must ensure all docs in each group are added as a block, and you have some way to find the last document of each group. One simple way to do this is to add a marker binary field:
网站访问量目前还很小,又不想重新建索引,于是还是采用了2次遍历法。2次遍历的第一次遍历是把分组拿出来,如果您只需要分组,不需要各个分组的数量,可以一次遍历即可。第二次遍历是把各个分组的搜索结果拿出来,当然也就能知道各个分组的数量。
2次遍历法由于需要经过2次搜索效率较低,因此引入了一个cache机制,CachingCollector。这样在第二次遍历是就可以直接读内存了。
代码片段如下:
public Map<String, Integer> groupBy(Query query, String field, int topCount) {
Map<String, Integer> map = new HashMap<String, Integer>();
long begin = System.currentTimeMillis();
int topNGroups = topCount;
int groupOffset = 0;
int maxDocsPerGroup = 100;
int withinGroupOffset = 0;
try {
TermFirstPassGroupingCollector c1 = new TermFirstPassGroupingCollector(field, Sort.RELEVANCE, topNGroups);
boolean cacheScores = true;
double maxCacheRAMMB = 4.0;
CachingCollector cachedCollector = CachingCollector.create(c1, cacheScores, maxCacheRAMMB);
indexSearcher.search(query, cachedCollector);
Collection<SearchGroup<String>> topGroups = c1.getTopGroups(groupOffset, true);
if (topGroups == null) {
return null;
}
TermSecondPassGroupingCollector c2 = new TermSecondPassGroupingCollector(field, topGroups, Sort.RELEVANCE, Sort.RELEVANCE, maxDocsPerGroup, true, true, true);
if (cachedCollector.isCached()) {
// Cache fit within maxCacheRAMMB, so we can replay it:
cachedCollector.replay(c2);
} else {
// Cache was too large; must re-execute query:
indexSearcher.search(query, c2);
}
TopGroups<String> tg = c2.getTopGroups(withinGroupOffset);
GroupDocs<String>[] gds = tg.groups;
for(GroupDocs<String> gd : gds) {
map.put(gd.groupValue, gd.totalHits);
}
} catch (IOException e) {
e.printStackTrace();
}
long end = System.currentTimeMillis();
System.out.println("group by time :" + (end - begin) + "ms");
return map;
}
几个参数说明:
-
groupField
: 分组域
-
groupSort
: 分组排序
-
topNGroups
: 最大分组数
-
groupOffset
: 分组分页用
-
withinGroupSort
: 组内结果排序
-
maxDocsPerGroup
: 每个分组的最多结果数
-
withinGroupOffset
: 组内分页用
分享到:
相关推荐
"Lucene group by" 指的就是在 Lucene 中实现基于特定字段的分组操作,类似于 SQL 中的 GROUP BY 子句。这使得用户能够按类别聚合文档,例如,根据作者、日期或其他分类标准来查看搜索结果。 在 Lucene 中,分组...
在"一步一步跟我学习lucene(12)---lucene搜索之分组处理group查询"中,我们将重点关注如何利用Lucene实现这一高级搜索功能。 首先,Lucene是一个开源全文搜索引擎库,它为Java开发者提供了构建高效、可扩展的搜索...
《Lucene.Net搜索引擎技术及其在锤子搜索引擎分组统计中的应用》 Lucene.Net是一个开源全文检索库,它是Apache Lucene项目的一个.NET平台实现。这个强大的搜索引擎库为开发者提供了高效、可扩展的文本搜索功能,...
"Lucene5学习之Group分组统计" 这个标题指出我们要讨论的是关于Apache Lucene 5版本中的一个特定功能——Grouping。在信息检索领域,Lucene是一个高性能、全文搜索引擎库,而Grouping是它提供的一种功能,允许用户对...
### Lucene 分组统计 #### 一、Lucene 分组统计概述 在 Lucene 的应用场景中,分组统计是一项非常重要的功能。它可以帮助用户快速获取文档集合中的统计数据,例如按类别进行分组并统计每组的数量等。在 Lucene 中...
其中,Facet(分面)查询是Lucene提供的一种强大的分类和统计功能,它允许用户根据特定的维度(如作者、类别等)对搜索结果进行分组和计数,从而帮助用户更深入地探索数据。本篇文章将详细探讨Lucene的分组查询优化...
2. **分组策略**:Lucene.NET提供了多种分组策略,如`TermGrouping`用于基于单个术语的分组,`FieldCacheTermsGrouping`用于基于多个术语的分组,以及`TopGroups`接口用于获取每个组的顶级结果。选择哪种策略取决于...
《Lucene全文搜索:分组、精确查找与模糊查找详解》 在IT行业中,全文搜索引擎的使用越来越广泛,而Apache Lucene作为一款强大的开源全文检索库,深受开发者们的喜爱。它提供了高效的索引和查询功能,使得在海量...
lucene-grouping-3.5.0.jar分组统计+分类统计插件 分组统计+分类统计
用到的工具 jsoup+spring+struct+DButil+mysql+lucene 可以配置采集网站的图片,包含分组统计,相同数据合并功能,主要是给群内成员来个demo,让大家有个学习的demo 小试牛刀、临时写的,莫吐槽 需要用到mysql...
lucene,lucene教程,lucene讲解。 为了对文档进行索引,Lucene 提供了五个基础的类 public class IndexWriter org.apache.lucene.index.IndexWriter public abstract class Directory org.apache.lucene.store....
lucene3.0 lucene3.0 lucene3.0 lucene3.0 lucene3.0
5. **过滤与聚合**:Filter和Collector组件可以用于进一步筛选结果,或者进行分组、统计等聚合操作。 6. **更新与删除**:Lucene支持动态索引更新,可以添加、修改或删除文档,并实时反映在搜索结果中。 7. **多...
标题 "lucene-group-score-query" 暗示我们讨论的主题是关于Apache Lucene的一个特定查询功能,即分组评分查询。Lucene是一个流行的全文搜索引擎库,由Java编写,广泛用于构建高效、可扩展的搜索解决方案。这个项目...
《Lucene in Action》是关于Apache Lucene的权威指南,这本书深入浅出地介绍了全文搜索引擎的构建和优化。Lucene是一个高性能、全文本搜索库,它允许开发人员在应用程序中轻松实现复杂的搜索功能。这本书主要面向...
【Lucene 简介】 Lucene 是一个强大的开源全文搜索库,由 Java 编写,主要用于为应用程序添加全文检索功能。它不是一个完整的全文搜索引擎应用,而是一个工具包,允许开发者将其集成到自己的软件中,以实现高效、...
《Annotated Lucene 中文版 Lucene源码剖析》是一本深入探讨Apache Lucene的书籍,专注于源码解析,帮助读者理解这个强大的全文搜索引擎库的工作原理。Lucene是一款开源的Java库,它提供了高效的文本搜索功能,被...
【Lucene 4.7.0 全套JAR包详解】 Lucene是一个开源全文搜索引擎库,由Apache软件基金会开发并维护。它提供了一个高级、灵活的文本搜索API,允许开发者轻松地在应用程序中实现复杂的搜索功能。这次提供的“lucene-...
本压缩包包含的是Lucene 3.5.0版本的全部源码,对于想要深入理解Lucene工作原理、进行二次开发或者进行搜索引擎相关研究的开发者来说,是一份非常宝贵的学习资源。 Lucene 3.5.0是Lucene的一个重要版本,它在3.x...
10. Lucene-5666:对非倒排访问(如排序、分类、分组)进行了改变,使用API而非`FieldCache`。推荐使用`UninvertingReader`,它支持多值数字字段,能检测到单值的多值字段,并且在兼容性方面有所提升。 11. Lucene-...