2017-05-21 10 views
1

私の理解によると、Luceneは逆索引を使用しています。私はのLucene 6. XXを使用していますが、私は簡単な方法についてはよく分からないですが、解決策はありませんよりも優れている逆インデックス形式のluceneを印刷

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

答えて

1

:転置インデックス形式で/印刷Luceneインデックス(Luceneの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); 
     }); 
    } 

2点、サポート

1.maximum文書 - Integer.MAX_VALUE。試したことはありませんが、おそらく、検索者の方法を使用して複数の検索を実行することで、この制限を排除できます。

2. doc.getFields()は、格納されているフィールドのみを返します。おそらく、フィールドが配列されていないフィールドに対しても、インデックスされたフィールドがすべて格納されていない場合は、静的フィールド配列を保持できます。Terms terms = searcher.getIndexReader().getTermVector(hit.doc,field.name());も有効です。

+0

このソリューションは効率的ではないことに注意してください(たとえば、3日間のつぶやきのインデックスには永久にかかる)。 – sareem

+0

** 3日間のつぶやきのインデックス**は無関係です、ドキュメントの数を言及してください。また、あなたが尋ねた論理に慣れていないことが明らかになりました。パフォーマンス角度は私が見ていないものです。私はパフォーマンス側も見ていきます。小さな文書セットでこれが正しく機能するならば、そのロジックをスケーラブルにすることを考えようとするかもしれません。 –

関連する問題