Index: lucene/CHANGES.txt =================================================================== --- lucene/CHANGES.txt (revision 1213386) +++ lucene/CHANGES.txt (working copy) @@ -612,6 +612,10 @@ (Mike McCandless, Uwe Schindler, Robert Muir, Chris Male, Yonik Seeley, Jason Rutherglen, Paul Elschot) +* LUCENE-3638: Added sugar methods to IndexReader and IndexSearcher to + load only certain fields when loading a document. (Peter Chang via + Mike McCandless) + Optimizations * LUCENE-2588: Don't store unnecessary suffixes when writing the terms Index: lucene/src/test/org/apache/lucene/index/TestIndexReader.java =================================================================== --- lucene/src/test/org/apache/lucene/index/TestIndexReader.java (revision 1213386) +++ lucene/src/test/org/apache/lucene/index/TestIndexReader.java (working copy) @@ -25,10 +25,9 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; -import java.util.Map; -import java.util.HashMap; import java.util.Random; -import org.junit.Assume; +import java.util.Set; + import org.apache.lucene.analysis.MockAnalyzer; import org.apache.lucene.document.BinaryField; import org.apache.lucene.document.Document; @@ -37,20 +36,18 @@ import org.apache.lucene.document.StringField; import org.apache.lucene.document.TextField; import org.apache.lucene.index.IndexReader.FieldOption; +import org.apache.lucene.index.IndexWriterConfig.OpenMode; import org.apache.lucene.index.codecs.lucene40.Lucene40PostingsFormat; -import org.apache.lucene.index.IndexWriterConfig.OpenMode; import org.apache.lucene.search.DocIdSetIterator; import org.apache.lucene.search.FieldCache; -import org.apache.lucene.search.similarities.DefaultSimilarity; -import org.apache.lucene.store.AlreadyClosedException; import org.apache.lucene.store.Directory; import org.apache.lucene.store.LockObtainFailedException; import org.apache.lucene.store.NoSuchDirectoryException; -import org.apache.lucene.store.LockReleaseFailedException; +import org.apache.lucene.util.Bits; +import org.apache.lucene.util.BytesRef; import org.apache.lucene.util.LuceneTestCase; import org.apache.lucene.util._TestUtil; -import org.apache.lucene.util.BytesRef; -import org.apache.lucene.util.Bits; +import org.junit.Assume; public class TestIndexReader extends LuceneTestCase { @@ -1066,4 +1063,23 @@ } } } + + public void testLoadCertainFields() throws Exception { + Directory dir = newDirectory(); + RandomIndexWriter writer = new RandomIndexWriter(random, dir); + Document doc = new Document(); + doc.add(newField("field1", "foobar", StringField.TYPE_STORED)); + doc.add(newField("field2", "foobaz", StringField.TYPE_STORED)); + writer.addDocument(doc); + IndexReader r = writer.getReader(); + writer.close(); + Set fieldsToLoad = new HashSet(); + assertEquals(0, r.document(0, fieldsToLoad).getFields().size()); + fieldsToLoad.add("field1"); + Document doc2 = r.document(0, fieldsToLoad); + assertEquals(1, doc2.getFields().size()); + assertEquals("foobar", doc2.get("field1")); + r.close(); + dir.close(); + } } Index: lucene/src/java/org/apache/lucene/search/IndexSearcher.java =================================================================== --- lucene/src/java/org/apache/lucene/search/IndexSearcher.java (revision 1213386) +++ lucene/src/java/org/apache/lucene/search/IndexSearcher.java (working copy) @@ -17,10 +17,10 @@ * limitations under the License. */ -import java.io.Closeable; import java.io.IOException; import java.util.Iterator; import java.util.NoSuchElementException; +import java.util.Set; import java.util.concurrent.Callable; import java.util.concurrent.CompletionService; import java.util.concurrent.ExecutionException; @@ -176,16 +176,21 @@ return reader; } - /* Sugar for .getIndexReader().document(docID) */ + /** Sugar for .getIndexReader().document(docID) */ public Document doc(int docID) throws CorruptIndexException, IOException { return reader.document(docID); } - /* Sugar for .getIndexReader().document(docID, fieldVisitor) */ + /** Sugar for .getIndexReader().document(docID, fieldVisitor) */ public void doc(int docID, StoredFieldVisitor fieldVisitor) throws CorruptIndexException, IOException { reader.document(docID, fieldVisitor); } + /** Sugar for .getIndexReader().document(docID, fieldsToLoad) */ + public final Document document(int docID, Set fieldsToLoad) throws CorruptIndexException, IOException { + return reader.document(docID, fieldsToLoad); + } + /** Expert: Set the SimilarityProvider implementation used by this Searcher. * */ Index: lucene/src/java/org/apache/lucene/index/IndexReader.java =================================================================== --- lucene/src/java/org/apache/lucene/index/IndexReader.java (revision 1213386) +++ lucene/src/java/org/apache/lucene/index/IndexReader.java (working copy) @@ -24,6 +24,7 @@ import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; import org.apache.lucene.document.Document; @@ -737,6 +738,17 @@ return visitor.getDocument(); } + /** + * Like {@link document(int)} but only loads the specified + * fields. Note that this is simply sugar for {@link + * DocumentStoredFieldVisitor#DocumentStoredFieldVisitor(Set)}. + */ + public final Document document(int docID, Set fieldsToLoad) throws CorruptIndexException, IOException { + final DocumentStoredFieldVisitor visitor = new DocumentStoredFieldVisitor(fieldsToLoad); + document(docID, visitor); + return visitor.getDocument(); + } + /** Returns true if any documents have been deleted */ public abstract boolean hasDeletions();