`
laccp
  • 浏览: 1270 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

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

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

/**
	 * 获取分组数据
	 * @return
	 * @throws Exception
	 */
	public Map<string list object>&amp;gt;&amp;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>&amp;gt; topGroups = c1.getTopGroups(groupOffset, true);
		
		if (topGroups == null) {
			
			return new HashMap<string list object>&amp;gt;&amp;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>&amp;gt;&amp;gt; ret = new HashMap<string list>&amp;gt;&amp;gt;(gds.length);
		
		List<map object>&amp;gt; list;
		
		Map<object object> map;
		
		IndexUtil iu = new IndexUtil();
		
		for (GroupDocs<string> gd : gds) {
			
			/**
			 * 这个就是分组以后的数据了,循环它,放到list里面去
			 */
			ScoreDoc [] docs = gd.scoreDocs;
			
			list = new ArrayList<map>&amp;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() &amp;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() &amp;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(12)---lucene搜索之分组处理group查询

    在Lucene中,分组查询(Grouping)是通过`org.apache.lucene.search.grouping`包来实现的,这个包提供了一种方式来对搜索结果按照指定字段进行分组,这样用户可以更直观地查看和理解数据。 要实现分组查询,我们...

    Lucene全文搜索 分组,精确查找,模糊查找

    通过熟练掌握分组查询、精确查找和模糊查找等技术,我们可以构建出满足各种需求的全文检索系统。同时,配合使用像IKAnalyzer这样的分词工具,可以进一步提升对中文文本的处理能力。无论是开发搜索引擎,还是在数据...

    Lucene5学习之Group分组统计

    2. **Grouping API**:Lucene提供了`GroupingSearch`类,它是实现分组查询的主要接口。使用者需要配置Grouping策略,指定分组字段,并设置是否需要对每个组进行排序等。 3. **GroupCollector和...

    lucene.netGroup

    这可能涉及到与数据库的交互,将数据导入Lucene.Net索引,然后提供一个API接口,使得前端能够发送查询请求,并接收分组统计后的搜索结果。在WindowsForm应用中,Lucene.Net可能被嵌入到桌面应用中,为用户提供本地...

    分组,建立索引

    5. **搜索与分组**:使用IndexSearcher进行查询,并利用Grouping API对搜索结果进行分组。 分组功能在Lucene.NET中可以通过`GroupFacetTermCollector`或`TopGroups`类来实现。我们可以指定分组字段,然后获取每个组...

    Solr分组统计

    在Solr中,分组统计(Grouping)是一种强大的功能,它允许用户基于某个字段对搜索结果进行分组,以便更好地理解和分析数据。分组统计可以提供每个分组内的文档数量,或者根据特定查询对每个分组进行进一步的过滤。 ...

    lucene 所有jar包 包含IKAnalyzer分词器

    `lucene-grouping-3.6.1.jar`实现了搜索结果的分组,方便用户按类别查看。最后,`lucene-spatial-3.6.1.jar`则提供了空间索引和查询的功能,对于地理信息检索特别有用。 总的来说,这个压缩包提供了一套完整的...

    lucene7.1.0所需jar包

    4. **文档和字段**: `lucene-docvalues.jar`和`lucene-grouping.jar`分别处理文档值和文档分组,这对于根据特定字段对搜索结果进行排序或分组非常有用。 5. **高性能特性**: `lucene-highlighter.jar`提供了高亮...

    《Lucene in Action》(第二版)(2)

    7. **聚合框架**:如`lucene-grouping.jar`,支持结果的分组,帮助用户更方便地浏览大量搜索结果。 8. **空间搜索**:如`lucene-spatial.jar`,支持地理空间索引和查询,适用于地图应用或其他需要地理位置搜索的...

    solr各个热点功能详解

    - **分组统计**:通过Grouping功能,可以对搜索结果进行分类统计,便于数据分析。 - **自动聚类**:Solr的Clustering功能可以自动将相似的文档聚类,帮助用户发现隐藏的相关性。 - **相似匹配**:基于TF-IDF等...

    apache-solr-ref-guide-7.1.pdf

    “Result Grouping”和“Result Clustering”部分分别阐述了如何对搜索结果进行分组和聚类处理。 “Spatial Search”部分提供了地理空间搜索功能的详细说明。 最后,“The Terms Component”、“The TermVector ...

Global site tag (gtag.js) - Google Analytics