lucene grouping 实现分组,并查询出分组数据

查询出分组以后的数据,请注意,这里没做分页。


/**
* 获取分组数据
* @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;

}
注:下文中的 *** 代表文件名中的组件名称。 # 包含: 中文-英文对照文档:【***-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、付费专栏及课程。

余额充值