2013-04-25 2 views
0

lucene 색인에서 검색하려고하지만이 검색을 필터링하고 싶습니다. 거기에는 두 개의 필드 내용과 범주가 있습니다. "내가 스포츠"를 가지고있는 파일을 검색하고 싶고 또한 파일이 얼마나 많은지를 세고 싶다. 나는이 코드를 다음과 같이 작성하려고 노력 중이다. 그러나 문제는 루프 실행으로 인해 수백만 개의 레코드가있는 경우 속도가 느려지므로 작업을 수행하는 다른 방법을 제안합니다.apache lucene index에서 검색하고 결과 그룹을 현명하게 계산하십시오.

시도 {파일 indexDir = 새로운 파일 ("파일의 경로")

  Directory directory = FSDirectory.open(indexDir); 

       IndexSearcher searcher = new IndexSearcher(directory, true); 
       int maxhits=1000000; 
       QueryParser parser1 = new QueryParser(Version.LUCENE_36, "contents", 

        new StandardAnalyzer(Version.LUCENE_36)); 

      Query qu=parser1.parse("sport"); 

       TopDocs topDocs = searcher.search(, maxhits); 
       ScoreDoc[] hits = topDocs.scoreDocs; 


      len = hits.length; 

     JOptionPane.showMessageDialog(null,"found times"+len); 

       int docId = 0; 
       Document d; 





String category=""; 

int ctr=0,ctr1=0; 

for (i = 0; i<len; i++) { 
docId = hits[i].doc; 
d = searcher.doc(docId); 
category= d.get(("category")); 
if(category.equals("a")) 
ctr++; 
if(category.equals("b")) 
ctr1++; 


} 

    JOptionPane.showMessageDialog("wprd found in category a times"+ctr); 
    JOptionPane.showMessageDialog("wprd found in category b times"+ctr1); 
    } 

catch(Exception ex) 

{ 

    ex.printStackTrace(); 
} 

답변

1

당신은 당신이 찾고있는 각 범주에 대한 쿼리 및 totalHits을 얻을 수 있습니다. TopDocs 인스턴스를 얻는 대신 TotalHitCountCollector을 사용하는 것이 더 좋습니다.

Query query = parser1.parser("+sport +category:a") 
TotalHitCountCollector collector = new TotalHitCountCollector(); 
search.search(query, collector); 
ctr = collector.getTotalHits(); 
query = parser1.parser("+sport +category:b") 
collector = new TotalHitCountCollector(); 
search.search(query, collector); 
ctr1 = collector.getTotalHits();