lucene或者compass有没有办法distinct一个filed?
brian314
2009-12-24
lucene或者compass有没有办法distinct一个filed?
例如,我有一个field是作者名称栏目,我想统计一下这段时间作者的数量,请问有什么办法? |
|
ybzshizds
2009-12-25
bobo broswer可以满足你的需求。下面是我写的一段代码,你可以拿去测试一下,应该差不多,一般200W条数据的统计在300ms左右,你只需在你的项目中加入两个jar包就可以了,一个是bobo-browse-2.0.7.jar,另一个是fastutil-5.0.9.jar
贴段代码 package com.youcompany.test; import java.io.IOException; import java.util.Arrays; import java.util.List; import java.util.Map; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.index.IndexReader; import org.apache.lucene.search.ConstantScoreRangeQuery; import org.apache.lucene.search.Query; import org.apache.lucene.store.FSDirectory; import com.browseengine.bobo.api.BoboBrowser; import com.browseengine.bobo.api.BoboIndexReader; import com.browseengine.bobo.api.Browsable; import com.browseengine.bobo.api.BrowseFacet; import com.browseengine.bobo.api.BrowseHit; import com.browseengine.bobo.api.BrowseRequest; import com.browseengine.bobo.api.BrowseResult; import com.browseengine.bobo.api.BrowseSelection; import com.browseengine.bobo.api.FacetAccessible; import com.browseengine.bobo.api.FacetSpec; import com.browseengine.bobo.api.FacetSpec.FacetSortSpec; import com.browseengine.bobo.facets.FacetHandler; import com.browseengine.bobo.facets.impl.SimpleFacetHandler; public class TestSearchAnthorByLucene { private static FSDirectory fsd; static { String indexDir = "/use/lucene/target/index/compos_0"; try { if(fsd == null){ fsd = FSDirectory.getDirectory(indexDir); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void test(String startTime, String endTime) throws Exception{ // define facet handlers // category facet handler SimpleFacetHandler authorHandler = new SimpleFacetHandler("authorName"); //作者名称在索引中的字段 List<FacetHandler> handlerList = Arrays.asList(new FacetHandler[]{authorHandler}); IndexReader reader = IndexReader.open(fsd,true); // decorate it with a bobo index reader BoboIndexReader boboReader = BoboIndexReader.getInstance(reader,handlerList); // creating a browse request BrowseRequest br=new BrowseRequest(); // parse a query ConstantScoreRangeQuery dateQuery = new ConstantScoreRangeQuery("postDate", startTime, endTime , true, true); br.setQuery(q);*/ // add the facet output specs FacetSpec authorSpec = new FacetSpec(); authorSpec.setOrderBy(FacetSortSpec.OrderHitsDesc); br.setFacetSpec("authorName",authorSpec); long startTime = System.currentTimeMillis(); // perform browse Browsable browser=new BoboBrowser(boboReader); BrowseResult result=browser.browse(br); int totalHits = result.getNumHits(); System.out.println("你的索引中的数据总数:" + totalHits); Map<String,FacetAccessible> facetMap = result.getFacetMap(); FacetAccessible anthorFacets = facetMap.get("authorName"); List<BrowseFacet> facetVals = anthorFacets.getFacets(); System.out.println("按作者名称统计:"); for(BrowseFacet facetVal : facetVals){ System.out.println("作者名为:"facetVal.getValue() +"发布的文章有:"+ facetVal.getHitCount() + "条"); } long endTime = System.currentTimeMillis(); System.out.println("总共用时:"+(endTime - startTime) + " ms"); } public static void main(String args[]) throws Exception{ TestSearchAnthorByLucene t = new TestSearchAnthorByLucene(); t.test("20090101","20090501"); } } |
|
ybzshizds
2009-12-25
怎么有些代码显示不出来了,晕,让我编辑了这么久
|
|
ybzshizds
2009-12-25
在你的项目中加入两个依赖包:
bobo-browse-2.0.7.jar,fastutil-5.0.9.jar |
|
ybzshizds
2009-12-25
System.out.println("作者名为:"facetVal.getValue() +
"发布的文章有:" + facetVal.getHitCount() ); |
|
ybzshizds
2009-12-25
// parse a query
ConstantScoreRangeQuery dateQuery = new ConstantScoreRangeQuery("postDate",startTime,endTime,true,true); |
|
ybzshizds
2009-12-25
System.out.println("你的索引中的数据总数:" + totalHits);
改为 System.out.println("在"+startTime+"至"+endTime+"时间范围内共有作者发布的文章数为:" + totalHits); |
|
ybzshizds
2009-12-25
如果看不清代码,请把页面另存为你机器上,然后更改显示代码的这个div的样式,就可以看到了。javaeye上的这个div的样式给的太窄了。另一种办法是你有firefox的firebug插件,直接将javaeye这个页面的div样式自行更改一下,也能看到代码。哈哈,到这了,不罗嗦了。帮人帮到底,希望javaeye上多出现一些看贴回帖的好人,这里太多看贴不回帖的人士了,好东西大家一起分享嘛,没必要那么神秘。有得罪的地方请看贴人见谅!
|
|
baseworld
2009-12-26
自定义 collect 方法
|
|
brian314
2009-12-26
ybzshizds 写道 如果看不清代码,请把页面另存为你机器上,然后更改显示代码的这个div的样式,就可以看到了。javaeye上的这个div的样式给的太窄了。另一种办法是你有firefox的firebug插件,直接将javaeye这个页面的div样式自行更改一下,也能看到代码。哈哈,到这了,不罗嗦了。帮人帮到底,希望javaeye上多出现一些看贴回帖的好人,这里太多看贴不回帖的人士了,好东西大家一起分享嘛,没必要那么神秘。有得罪的地方请看贴人见谅!
你好热心喔,我能跟你交个朋友吗? |