查询出分组以后的数据,请注意,这里没做分页。
/**
* 获取分组数据
* @return
* @throws Exception
*/
public Map<string list object>&gt;&gt; getGroupSearchData() throws Exception {
int groupOffset = 0;
int maxDocsPerGroup = 100;
int withinGroupOffset = 0;
int topNGroups = 10;
TermFirstPassGroupingCollector c1 = new TermFirstPassGroupingCollector(Constant.CATEGORY, Sort.RELEVANCE, topNGroups);
boolean cacheScores = true;
double maxCacheRAMMB = 4.0;
CachingCollector cachedCollector = CachingCollector.create(c1,cacheScores, maxCacheRAMMB);
AAnalyzer analyzer = new AAnalyzer(true,false);
BooleanQuery query = this.searchParamter.getBooleanQuery();
SysContext context = SysContext.getInstance();
IndexSearcher search = context.getSearcher();
search.search(query, cachedCollector);
Collection<searchgroup>&gt; topGroups = c1.getTopGroups(groupOffset, true);
if (topGroups == null) {
return new HashMap<string list object>&gt;&gt;(0);
}
TermSecondPassGroupingCollector c2 = new TermSecondPassGroupingCollector(Constant.CATEGORY, topGroups, Sort.RELEVANCE, Sort.RELEVANCE,maxDocsPerGroup, true, true, true);
if (cachedCollector.isCached()) {
cachedCollector.replay(c2);
} else {
context.getSearcher().search(query, c2);
}
TopGroups<string> tg = c2.getTopGroups(withinGroupOffset);
// 同义词
SynonymDic synDic = this.searchParamter.getAnalyzer().getSynDic();
//标红显示符合查询的字
SimpleHTMLFormatter sh = new SimpleHTMLFormatter("<font color="red">", "</font>" , synDic.getSynonym());
Highlighter high = new Highlighter(sh, new QueryScorer(query));
high.setTextFragmenter(new SimpleFragmenter(100));
GroupDocs<string>[] gds = tg.groups;
Document doc = null;
Map<string list object>&gt;&gt; ret = new HashMap<string list>&gt;&gt;(gds.length);
List<map object>&gt; list;
Map<object object> map;
IndexUtil iu = new IndexUtil();
for (GroupDocs<string> gd : gds) {
/**
* 这个就是分组以后的数据了,循环它,放到list里面去
*/
ScoreDoc [] docs = gd.scoreDocs;
list = new ArrayList<map>&gt;(gd.totalHits);
for (ScoreDoc scoreDoc : docs) {
map = new HashMap<object object>();
doc = context.getSearcher().doc(scoreDoc.doc);
String content = iu.getNoHtml(true,doc.get(Constant.CONTENT));
TokenStream tokenStream = analyzer.tokenStream(Constant.CONTENT,new StringReader(content));
String tmpStr = high.getBestFragment(tokenStream, content);
if (tmpStr != null) {
content = tmpStr;
} else{
content = iu.getContent(content, 100);// content.substring(0 , content.length() &gt;= 100 ? 100 : content.length());
}
String title = iu.getNoHtml(true,doc.get(Constant.TITLE));
tokenStream = analyzer.tokenStream(Constant.TITLE, new StringReader(title));
String tmpName = high.getBestFragment(tokenStream, title);
if (tmpName != null) {
title = tmpName;
} else{
title = iu.getContent(title,100);//title.substring(0 , title.length() &gt;= 100 ? 100 : title.length());
}
tokenStream.close();
map.put(Constant.ID, doc.get(Constant.ID));
map.put(Constant.TITLE, title);
map.put(Constant.CONTENT, content);
map.put(Constant.PATH, doc.get(Constant.PATH));
map.put(Constant.OUTSIDEURL, doc.get(Constant.OUTSIDEURL));
map.put(Constant.INDEX_TYPE, doc.get(Constant.INDEX_TYPE));
map.put(Constant.ATTACH_TYPE, doc.get(Constant.ATTACH_TYPE));
map.put(Constant.CATEGORY, doc.get(Constant.CATEGORY));
list.add(map);
}
ret.put(gd.groupValue, list);
}
// 用完了就释放该查询
context.releaseSearcher(search);
return ret;
}

- 大小: 66.7 KB
分享到:
相关推荐
在Lucene中,分组查询(Grouping)是通过`org.apache.lucene.search.grouping`包来实现的,这个包提供了一种方式来对搜索结果按照指定字段进行分组,这样用户可以更直观地查看和理解数据。 要实现分组查询,我们...
通过熟练掌握分组查询、精确查找和模糊查找等技术,我们可以构建出满足各种需求的全文检索系统。同时,配合使用像IKAnalyzer这样的分词工具,可以进一步提升对中文文本的处理能力。无论是开发搜索引擎,还是在数据...
2. **Grouping API**:Lucene提供了`GroupingSearch`类,它是实现分组查询的主要接口。使用者需要配置Grouping策略,指定分组字段,并设置是否需要对每个组进行排序等。 3. **GroupCollector和...
这可能涉及到与数据库的交互,将数据导入Lucene.Net索引,然后提供一个API接口,使得前端能够发送查询请求,并接收分组统计后的搜索结果。在WindowsForm应用中,Lucene.Net可能被嵌入到桌面应用中,为用户提供本地...
5. **搜索与分组**:使用IndexSearcher进行查询,并利用Grouping API对搜索结果进行分组。 分组功能在Lucene.NET中可以通过`GroupFacetTermCollector`或`TopGroups`类来实现。我们可以指定分组字段,然后获取每个组...
在Solr中,分组统计(Grouping)是一种强大的功能,它允许用户基于某个字段对搜索结果进行分组,以便更好地理解和分析数据。分组统计可以提供每个分组内的文档数量,或者根据特定查询对每个分组进行进一步的过滤。 ...
`lucene-grouping-3.6.1.jar`实现了搜索结果的分组,方便用户按类别查看。最后,`lucene-spatial-3.6.1.jar`则提供了空间索引和查询的功能,对于地理信息检索特别有用。 总的来说,这个压缩包提供了一套完整的...
4. **文档和字段**: `lucene-docvalues.jar`和`lucene-grouping.jar`分别处理文档值和文档分组,这对于根据特定字段对搜索结果进行排序或分组非常有用。 5. **高性能特性**: `lucene-highlighter.jar`提供了高亮...
7. **聚合框架**:如`lucene-grouping.jar`,支持结果的分组,帮助用户更方便地浏览大量搜索结果。 8. **空间搜索**:如`lucene-spatial.jar`,支持地理空间索引和查询,适用于地图应用或其他需要地理位置搜索的...
- **分组统计**:通过Grouping功能,可以对搜索结果进行分类统计,便于数据分析。 - **自动聚类**:Solr的Clustering功能可以自动将相似的文档聚类,帮助用户发现隐藏的相关性。 - **相似匹配**:基于TF-IDF等...
“Result Grouping”和“Result Clustering”部分分别阐述了如何对搜索结果进行分组和聚类处理。 “Spatial Search”部分提供了地理空间搜索功能的详细说明。 最后,“The Terms Component”、“The TermVector ...