Index: src/java/org/apache/lucene/index/DocumentsWriterFieldMergeState.java =================================================================== --- src/java/org/apache/lucene/index/DocumentsWriterFieldMergeState.java (revision 639536) +++ src/java/org/apache/lucene/index/DocumentsWriterFieldMergeState.java (working copy) @@ -30,6 +30,7 @@ private Posting p; char[] text; int textOffset; + int textLen; private int postingUpto = -1; @@ -49,6 +50,7 @@ text = field.threadState.charPool.buffers[p.textStart >> DocumentsWriter.CHAR_BLOCK_SHIFT]; textOffset = p.textStart & DocumentsWriter.CHAR_BLOCK_MASK; + textLen = p.textLen; if (p.freqUpto > p.freqStart) freq.init(field.threadState.postingsPool, p.freqStart, p.freqUpto); Index: src/java/org/apache/lucene/index/DocumentsWriterFieldData.java =================================================================== --- src/java/org/apache/lucene/index/DocumentsWriterFieldData.java (revision 639536) +++ src/java/org/apache/lucene/index/DocumentsWriterFieldData.java (working copy) @@ -460,6 +460,7 @@ p = threadState.postingsFreeList[--threadState.postingsFreeCount]; p.textStart = textUpto + threadState.charPool.byteOffset; + p.textLen = tokenTextLen; threadState.charPool.byteUpto += textLen1; System.arraycopy(tokenText, 0, text, textUpto, tokenTextLen); @@ -657,9 +658,7 @@ if (p0 != null) { final int start = p0.textStart & DocumentsWriter.CHAR_BLOCK_MASK; final char[] text = threadState.charPool.buffers[p0.textStart >> DocumentsWriter.CHAR_BLOCK_SHIFT]; - int pos = start; - while(text[pos] != 0xffff) - pos++; + int pos = start+p0.textLen; int code = 0; while (pos > start) code = (code*31) + text[--pos]; Index: src/java/org/apache/lucene/index/Posting.java =================================================================== --- src/java/org/apache/lucene/index/Posting.java (revision 639536) +++ src/java/org/apache/lucene/index/Posting.java (working copy) @@ -22,6 +22,7 @@ * last flush. */ final class Posting { int textStart; // Address into char[] blocks where our text is stored + int textLen; // text length int docFreq; // # times this term occurs in the current doc int freqStart; // Address of first byte[] slice for freq int freqUpto; // Next write address for freq Index: src/java/org/apache/lucene/index/DocumentsWriterThreadState.java =================================================================== --- src/java/org/apache/lucene/index/DocumentsWriterThreadState.java (revision 639536) +++ src/java/org/apache/lucene/index/DocumentsWriterThreadState.java (working copy) @@ -670,23 +670,24 @@ return 0; final char[] text1 = charPool.buffers[p1.textStart >> DocumentsWriter.CHAR_BLOCK_SHIFT]; int pos1 = p1.textStart & DocumentsWriter.CHAR_BLOCK_MASK; + int len1 = p1.textLen; final char[] text2 = charPool.buffers[p2.textStart >> DocumentsWriter.CHAR_BLOCK_SHIFT]; int pos2 = p2.textStart & DocumentsWriter.CHAR_BLOCK_MASK; + int len2 = p2.textLen; + + int scanpos=0; + boolean samelength = (len1==len2) ? true:false; while(true) { final char c1 = text1[pos1++]; final char c2 = text2[pos2++]; - if (c1 < c2) - if (0xffff == c2) - return 1; + if (c1 < c2) return -1; + else if (c2 < c1) return 1; + scanpos++; + if (len1==scanpos || len2==scanpos) + if(samelength) + return 0; else - return -1; - else if (c2 < c1) - if (0xffff == c1) - return -1; - else - return 1; - else if (0xffff == c1) - return 0; + return len1