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上多出现一些看贴回帖的好人,这里太多看贴不回帖的人士了,好东西大家一起分享嘛,没必要那么神秘。有得罪的地方请看贴人见谅!


你好热心喔,我能跟你交个朋友吗?
Global site tag (gtag.js) - Google Analytics