I\'m trying to update my code from Lucene 3.4 to 4.1. I figured out the changes except one. I have code which needs to iterate over all term values for one field. In Lucene
Please follow Lucene 4 Migration guide::
How you obtain the enums has changed. The primary entry point is the
Fieldsclass. If you know your reader is a single segment reader, do this:Fields fields = reader.Fields(); if (fields != null) { ... }If the reader might be multi-segment, you must do this:
Fields fields = MultiFields.getFields(reader); if (fields != null) { ... }The
fieldsmay benull(eg if the reader has no fields).Note that the
MultiFieldsapproach entails a performance hit onMultiReaders, as it must merge terms/docs/positions on the fly. It's generally better to instead get the sequential readers (useoal.util.ReaderUtil) and then step through those readers yourself, if you can (this is how Lucene drives searches).If you pass a
SegmentReadertoMultiFields.fieldsit will simply returnreader.fields(), so there is no performance hit in that case.Once you have a non-null Fields you can do this:
Terms terms = fields.terms("field"); if (terms != null) { ... }The
termsmay benull(eg if the field does not exist).Once you have a non-
nullterms you can get an enum like this:TermsEnum termsEnum = terms.iterator();The returned
TermsEnumwill not be null.You can then
.next()through theTermsEnum