2013-03-08 12 views
12

Sto tentando di aggiornare il mio codice da Lucene 3.4 a 4.1. Ho capito le modifiche tranne una. Ho un codice che ha bisogno di scorrere tutti i valori dei termini per un campo. In Lucene 3.1 c'era un metodo IndexReader # terms() che forniva un TermEnum, che potevo ripetere. Questo sembra essere cambiato per Lucene 4.1 e anche dopo diverse ore di ricerca nella documentazione non sono in grado di capire come. qualcuno può indicarmi la giusta direzione?Come ottenere tutti i termini per un campo Lucene in Lucene 4

Grazie.

+0

Ho appena spostato la parte risposta alla risposta contrassegnato dal momento che potrebbe essere fonte di confusione e non intuitivo per cercare e trovare la risposta nella formulazione domanda. – MahNas92

risposta

2

Si prega di seguire Lucene 4 Migration guide ::

Come si ottengono le enumerazioni è cambiato. Il punto di ingresso principale è la classe Fields. Se si conosce il lettore è un unico lettore di segmento, fare questo:

Fields fields = reader.Fields(); 
if (fields != null) { 
    ... 
} 

Se il lettore potrebbe essere multi-segmento, è necessario farlo:

Fields fields = MultiFields.getFields(reader); 
if (fields != null) { 
    ... 
} 

Il fields può essere null (ad esempio, se il lettore non ha campi).

Si noti che l'approccio MultiFields comporta un calo di prestazioni su MultiReaders, in quanto deve unire termini/documenti/posizioni al volo. È in genere meglio acquistare lettori sequenziali (utilizzare oal.util.ReaderUtil) e quindi passare direttamente da quei lettori, se possibile (questo è il modo in cui Lucene guida le ricerche).

Se si passa un SegmentReader per MultiFields.fields lo farà semplicemente ritorno reader.fields(), quindi non c'è prestazioni colpito in quel caso.

Una volta che avete campi non nulli si può fare questo:

Terms terms = fields.terms("field"); 
if (terms != null) { 
    ... 
} 

Il terms può essere null (ad esempio, se il campo non esiste).

Una volta che avete non null termini è possibile ottenere un enum come questo:

TermsEnum termsEnum = terms.iterator(); 

La restituito TermsEnum non ci sarà nulla.

È quindi possibile .next() attraverso il TermsEnum

+11

Ottimo per menzionare la guida alla migrazione, ma penso che la tua risposta sarebbe molto più utile se potessi pubblicare qui la parte pertinente alla domanda e ciò che suggerisci di fare. – javanna

+2

Ho appena aggiunto la parte pertinente alla mia domanda sopra. – ali

+0

hmm, mio ​​male, lo prenderò in considerazione da ora in poi .. – phani