2011-09-26 3 views
0

J'ai un index Lucene que je voudrais itérer (pour l'évaluation ponctuelle au stade actuel du développement) J'ai 4 documents avec chacun quelques centaines de milliers jusqu'à des millions d'entrées, que je veux itérer pour compter le nombre de mots pour chaque entrée (~ 2-10) et calculer la distribution de fréquence.Lucene: Itérer toutes les entrées

Ce que je fais en ce moment est la suivante:

for (int i = 0; i < reader.maxDoc(); i++) { 
        if (reader.isDeleted(i)) 
         continue; 

        Document doc = reader.document(i); 
       Field text = doc.getField("myDocName#1"); 

       String content = text.stringValue(); 


       int wordLen = countNumberOfWords(content); 
//store 
} 

Jusqu'à présent, il est quelque chose itération. Le débogage confirme qu'il fonctionne au moins sur les termes stockés dans le document, mais pour une raison quelconque, il ne traite qu'une petite partie des termes stockés. Je me demande ce que je fais mal? Je veux simplement parcourir tous les documents et tout ce qui y est stocké?

Répondre

1

Premièrement, vous devez vous assurer index avec TermVectors ENABLED

doc.add(new Field(TITLE, page.getTitle(), Field.Store.YES, Field.Index.ANALYZED, TermVector.WITH_POSITIONS_OFFSETS)); 

Ensuite, vous pouvez utiliser IndexReader.getTermFreqVector compter termes

TopDocs res = indexSearcher.search(YOUR_QUERY, null, 1000); 

// iterate over documents in res, ommited for brevity 

reader.getTermFreqVector(res.scoreDocs[i].doc, YOUR_FIELD, new TermVectorMapper() { 
      public void map(String termval, int freq, TermVectorOffsetInfo[] offsets, int[] positions) { 
       // increment frequency count of termval by freq 
       freqs.increment(termval, freq); 
      } 

      public void setExpectations(String arg0, int arg1,boolean arg2, boolean arg3) {} 
}); 
Questions connexes