protected override void WriteSkipData(int level, IndexOutput skipBuffer) { // To efficiently store payloads in the posting lists we do not store the length of // every payload. Instead we omit the length for a payload if the previous payload had // the same length. // However, in order to support skipping the payload length at every skip point must be known. // So we use the same length encoding that we use for the posting lists for the skip data as well: // Case 1: current field does not store payloads // SkipDatum --> DocSkip, FreqSkip, ProxSkip // DocSkip,FreqSkip,ProxSkip --> VInt // DocSkip records the document number before every SkipInterval th document in TermFreqs. // Document numbers are represented as differences from the previous value in the sequence. // Case 2: current field stores payloads // SkipDatum --> DocSkip, PayloadLength?, FreqSkip,ProxSkip // DocSkip,FreqSkip,ProxSkip --> VInt // PayloadLength --> VInt // In this case DocSkip/2 is the difference between // the current and the previous value. If DocSkip // is odd, then a PayloadLength encoded as VInt follows, // if DocSkip is even, then it is assumed that the // current payload length equals the length at the previous // skip point if (CurStorePayloads) { int delta = CurDoc - LastSkipDoc[level]; if (CurPayloadLength == LastSkipPayloadLength[level]) { // the current payload length equals the length at the previous skip point, // so we don't store the length again skipBuffer.WriteVInt32(delta * 2); } else { // the payload length is different from the previous one. We shift the DocSkip, // set the lowest bit and store the current payload length as VInt. skipBuffer.WriteVInt32(delta * 2 + 1); skipBuffer.WriteVInt32(CurPayloadLength); LastSkipPayloadLength[level] = CurPayloadLength; } } else { // current field does not store payloads skipBuffer.WriteVInt32(CurDoc - LastSkipDoc[level]); } skipBuffer.WriteVInt32((int)(CurFreqPointer - LastSkipFreqPointer[level])); skipBuffer.WriteVInt32((int)(CurProxPointer - LastSkipProxPointer[level])); LastSkipDoc[level] = CurDoc; LastSkipFreqPointer[level] = CurFreqPointer; LastSkipProxPointer[level] = CurProxPointer; }