2017-05-21 9 views
1

제 생각에 따르면 Lucene은 역 색인을 사용합니다. 내가 루씬 6.xx의를 사용하고 난 어떤 쉬운 방법에 대해 확실하지 오전하지만 해결책이없는 것보다 낫다역 색인 형식의 lucene 인쇄

term1 <doc1, doc100, ..., doc555> 
term1 <doc1, ..., doc100, ..., do89> 
term1 <doc3, doc2, doc5, ...> 
. 
. 
. 
termn <doc10, doc43, ..., dock> 

답변

1

: 반전 된 인덱스 형식으로/인쇄 루씬 지수 (루씬 6)를 추출하는 방법이 있나요 솔루션. 이런 식으로 날 위해 - MatchAllDocsQuery을 사용하여 작동합니다.

private static void printWholeIndex(IndexSearcher searcher) throws IOException{ 
     MatchAllDocsQuery query = new MatchAllDocsQuery(); 
     TopDocs hits = searcher.search(query, Integer.MAX_VALUE); 

     Map<String, Set<Integer>> invertedIndex = new HashMap<>(); 


     if (null == hits.scoreDocs || hits.scoreDocs.length <= 0) { 
      System.out.println("No Hits Found with MatchAllDocsQuery"); 
      return; 
     } 

     for (ScoreDoc hit : hits.scoreDocs) { 
      Document doc = searcher.doc(hit.doc); 

      List<IndexableField> allFields = doc.getFields(); 

      for(IndexableField field:allFields){ 



      //Single document inverted index 
      Terms terms = searcher.getIndexReader().getTermVector(hit.doc,field.name()); 

      if (terms != null) { 
       TermsEnum termsEnum = terms.iterator(); 
       while(termsEnum.next() != null){ 
       if(invertedIndex.containsKey(termsEnum.term().utf8ToString())){ 
        Set<Integer> existingDocs = invertedIndex.get(termsEnum.term().utf8ToString()); 
        existingDocs.add(hit.doc); 
        invertedIndex.put(termsEnum.term().utf8ToString(),existingDocs); 

       }else{ 
        Set<Integer> docs = new TreeSet<>(); 
        docs.add(hit.doc); 
        invertedIndex.put(termsEnum.term().utf8ToString(), docs); 
       } 
       } 
      } 
     } 
     } 

     System.out.println("Printing Inverted Index:"); 

     invertedIndex.forEach((key , value) -> {System.out.println(key+":"+value); 
     }); 
    } 

두 점,

1.maximum 문서 지원 - Integer.MAX_VALUE. 시도하지는 않았지만 검색 자의 검색 방법을 사용하여 복수 검색을 수행하면이 제한을 없앨 수 있습니다.

2. doc.getFields()은 저장된 필드 만 반환합니다. 아마도 모든 인덱싱 된 필드가 라인 이후에 저장되지 않으면 정적 필드 배열을 유지할 수 있습니다. Terms terms = searcher.getIndexReader().getTermVector(hit.doc,field.name());도 저장된 필드가 아닌 경우에도 작동합니다.

+0

이 솔루션은 효율적이지 않습니다 (예 : 3 일간의 트윗 색인에 영원히 소요됨). – sareem

+0

** 3 일간의 트윗 색인 **은 부적절합니다. 문서 수를 언급하십시오. 또한, 당신이 물어 보는 논리 때문에 내가 경험하지 못했다는 것을 분명히했습니다. 성능 각도는 내가 보지 않은 것입니다. 나는 성능면에서도 살펴볼 것입니다. 작은 문서 세트에서 이것이 올바르게 작동한다면, 그 논리를 확장 성있게 만드는 것에 대해 생각해보십시오. –