bobo - browse 는 Lucene 에 그룹 통 계 를 추가 합 니 다.

60697 단어 Lucene
http://www.cnblogs.com/ibook360/archive/2011/11/15/2250018.html
bobo - browse 는 Lucene 에 그룹 통 계 를 추가 합 니 다.
Bobo - browse 는 lucene 의 검색 결 과 를 기반 으로 한 그룹 별 집계 오픈 소스 플러그 인 으로, 타 오 바 오 에서 '셔츠' 를 검색 하고 검색 결과 상단 에 '긴팔 셔츠 (10321) 반팔 셔츠 (32561)' 등 검색 결 과 를 집계 할 수 있다.루 셀 은 3.2.0 에서 도 그룹 핑 구성 요 소 를 제공 하여 그룹 통계 기능 을 제공 하고 토론 을 하 였 으 나 여 기 는 토론 을 하지 않 습 니 다.
      Bobo - browse 프로젝트 에 따 르 면 Linkedin. com 은 이 구성 요 소 를 사용 했다.
      Bobo - browse 는 검색 에 만 관심 을 가지 고 색인 생 성 은 상관 없습니다. 색인 생 성 은 표준 Lucene 색인 생 성 방법 으로 계속 만 듭 니 다.      Bobo - browse 프로젝트 주 소 는?  http://sna-projects.com/bobo/ 다음은 테스트 코드 에 사용 되 는 구성 요소 및 버 전 입 니 다. Bobo - browse: 2.5.0 - rc1Lucene: 3.4.0log4j: 1.2.16Fastutil: 6.4
 
테스트 코드:
import java.util.*;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriter.MaxFieldLength;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopScoreDocCollector;
import org.apache.lucene.index.*;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.util.Version;
import org.apache.lucene.search.*;
import org.apache.lucene.queryParser.*;

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.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.*;
import com.browseengine.bobo.facets.impl.SimpleFacetHandler;
import com.browseengine.bobo.facets.data.PredefinedTermListFactory;

public class TestBoboBrowse {

private Directory indexDir = null;
private Version luceneVersion = Version.LUCENE_34;

/**
*
@param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
TestBoboBrowse app = new TestBoboBrowse();
app.test1();
}

public void test1(){

try{
indexDir = new RAMDirectory();

createIndex();
searchTest();

indexDir.close();
}catch(Exception ex){
ex.printStackTrace();
}
}

public void createIndex(){
String[][] data = new String[][]{
new String[] {"lenovo", "Intel", "PC Core2 E8200 2GB DDR2 250GB 7200RPM 22LCD", "08998"},
new String[] {"lenovo", "Intel", "PC Core2 E8300 2GB DDR2 320GB 7200RPM 22LCD", "09998"},
new String[] {"lenovo", "Intel", "PC Core2 Q6600 2GB DDR2 320GB 7200RPM 22LCD", "11998"},
new String[] {"lenovo", "Intel", "PC Core2 QX9770 4GB DDR2 320GB 7200RPM RAID-1 22LCD", "19998"},
new String[] {"lenovo", "Intel", "PC pentium E2200 1GB DDR2 160GB 5400RPM 19LCD", "05998"},
new String[] {"hp", "Intel", "PC pentium E2180 1GB DDR2 160GB 7200RPM 20LCD", "06398"},
new String[] {"hp", "Intel", "PC Core2 E8200 2GB DDR2 250GB 5400RPM 22LCD", "08998"},
new String[] {"hp", "Intel", "PC Core2 E6550 2GB DDR2 250GB 7200RPM 20LCD", "07398"},
new String[] {"hp", "Intel", "PC Core2 QX6850 4GB DDR2 320GB 5400RPM 22LCD", "13998"},
new String[] {"asus", "AMD", "PC Core2 QX9650 4GB DDR2 450GB 7200RPM 22LCD", "17998"},
new String[] {"dell", "AMD", "PC Core2 athlon FX76 4GB DDR2 450GB 7200RPM 22LCD", "12998"}
};

try{
Analyzer analyzer = new StandardAnalyzer(luceneVersion);

// Lucene Version >= 3.2.0 (Version.LUCENE_32)
IndexWriterConfig indexConfig = new IndexWriterConfig(luceneVersion, analyzer);
indexConfig.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND);
IndexWriter indexWriter = new IndexWriter(indexDir, indexConfig);

// Lucene Version < 3.2.0 (Version.LUCENE_32)
// IndexWriter indexWriter = new IndexWriter(indexDir, analyzer, true, MaxFieldLength.LIMITED);

for(int i = 0; i < data.length; i++){
Document doc = new Document();
doc.add(new Field("vendor",data[i][0], Field.Store.YES, Field.Index.NOT_ANALYZED));
doc.add(new Field("cpu",data[i][1], Field.Store.YES, Field.Index.NOT_ANALYZED));
doc.add(new Field("desc",data[i][2], Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("price",data[i][3], Field.Store.YES, Field.Index.NOT_ANALYZED));
indexWriter.addDocument(doc);
}

indexWriter.optimize();
indexWriter.commit();
indexWriter.close();
}catch(Exception ex){
ex.printStackTrace();
}
}

private void searchTest(){
try{
String fieldName = "desc";
String keywords = "Core2";
QueryParser queryParser = new QueryParser(luceneVersion, fieldName, new StandardAnalyzer(luceneVersion));
Query query = queryParser.parse(keywords);

IndexReader indexReader = IndexReader.open(indexDir,true);

List<FacetHandler<?>> facetHandlers = new ArrayList<FacetHandler<?>>();
facetHandlers.add(new SimpleFacetHandler("vendor"));
facetHandlers.add(new SimpleFacetHandler("cpu"));

//facetHandlers.add(new RangeFacetHandler("price", Arrays.asList(new String[]{"[* TO 09998]", "[09999 TO 11998]", "[11999 TO *]"})));
String[] ranges = new String[]{"[00000 TO 09999]", "[10000 TO 11998]", "[11999 TO 30000]"};
facetHandlers.add(new RangeFacetHandler("price", new PredefinedTermListFactory(Integer.class, "0"), Arrays.asList(ranges)));

BoboIndexReader boboIndexReader = BoboIndexReader.getInstance(indexReader,facetHandlers);
BrowseRequest browseRequest = new BrowseRequest();
browseRequest.setCount(10);
browseRequest.setOffset(0);

browseRequest.setQuery(query);

//SortField[] sortFields = new SortField[2]; //
//sortFields[0] = new SortField("vendor", SortField.STRING, true);
//sortFields[1] = new SortField("price", SortField.INT, true);
//browseRequest.setSort(sortFields);

FacetSpec facetSpec = new FacetSpec();
facetSpec.setMaxCount(10);//
facetSpec.setOrderBy(FacetSortSpec.OrderHitsDesc);

browseRequest.setFacetSpec("vendor", facetSpec);
browseRequest.setFacetSpec("cpu", facetSpec);
browseRequest.setFacetSpec("price", facetSpec);

Browsable browser = new BoboBrowser(boboIndexReader);
BrowseResult browseResult = browser.browse(browseRequest);

int totalHits = browseResult.getNumHits();
BrowseHit[] browseHit = browseResult.getHits();

System.out.println("=====Total records: "+totalHits);

//
Map<String,FacetAccessible> facetMap = browseResult.getFacetMap();
if(facetMap.size() > 0){
System.out.println("-------Vendor-----------------------");

FacetAccessible vendorFacets = facetMap.get("vendor");
List<BrowseFacet> facetVals = vendorFacets.getFacets();
for(BrowseFacet f:facetVals){
System.out.println(f.getValue() + "(" + f.getHitCount() + ")");
}

System.out.println("-------CPU----------------");
FacetAccessible cpuFacets = facetMap.get("cpu");
facetVals = cpuFacets.getFacets();
for(BrowseFacet f:facetVals){
System.out.println(f.getValue() + "(" + f.getHitCount() + ")");
}

System.out.println("-------Price----------------");
FacetAccessible priceFacets = facetMap.get("price");
facetVals = priceFacets.getFacets();
for(BrowseFacet f:facetVals){
System.out.println(f.getValue() + "(" + f.getHitCount() + ")");
}
}

boboIndexReader.close();
indexReader.close();
}catch(Exception ex){
ex.printStackTrace();
}
}
}


 
출력 결과:
Total records: 9
-------Vendor-----------------------
lenovo(4)
hp(3)
asus(1)
dell(1)
-------CPU----------------
Intel(7)
AMD(2)
-------Price----------------
[00000 TO 09999](4)
[11999 TO 30000](4)
[10000 TO 11998](1)

좋은 웹페이지 즐겨찾기