Index: src/java/org/apache/lucene/index/SegmentMerger.java =================================================================== --- src/java/org/apache/lucene/index/SegmentMerger.java (revision 320607) +++ src/java/org/apache/lucene/index/SegmentMerger.java (working copy) @@ -311,9 +311,9 @@ resetSkip(); for (int i = 0; i < n; i++) { SegmentMergeInfo smi = smis[i]; - TermPositions postings = smi.postings; + TermPositions postings = smi.getPositions(); int base = smi.base; - int[] docMap = smi.docMap; + int[] docMap = smi.getDocMap(); postings.seek(smi.termEnum); while (postings.next()) { int doc = postings.doc(); Index: src/java/org/apache/lucene/index/SegmentMergeInfo.java =================================================================== --- src/java/org/apache/lucene/index/SegmentMergeInfo.java (revision 320607) +++ src/java/org/apache/lucene/index/SegmentMergeInfo.java (working copy) @@ -23,8 +23,8 @@ int base; TermEnum termEnum; IndexReader reader; - TermPositions postings; - int[] docMap = null; // maps around deleted docs + private TermPositions postings; // use getPositions() + private int[] docMap; // use getDocMap() SegmentMergeInfo(int b, TermEnum te, IndexReader r) throws IOException { @@ -32,8 +32,11 @@ reader = r; termEnum = te; term = te.term(); - postings = reader.termPositions(); + } + // maps around deleted docs + int[] getDocMap() { + if (docMap == null) { // build array which maps document numbers around deletions if (reader.hasDeletions()) { int maxDoc = reader.maxDoc(); @@ -47,6 +50,15 @@ } } } + return docMap; + } + + TermPositions getPositions() throws IOException { + if (postings == null) { + postings = reader.termPositions(); + } + return postings; + } final boolean next() throws IOException { if (termEnum.next()) { @@ -60,7 +72,9 @@ final void close() throws IOException { termEnum.close(); + if (postings != null) { postings.close(); } } +}