Skip to content

Commit 9b12969

Browse files
lucene_snapshot: Update to new Lucene 10.3 postings format (#128240)
There are a few different things going on in this PR, all of which are required to get the lucene_snspahot branch building again, but the most substantial is the update to the new Lucene 10.3 postings format, Lucene103PostingsFormat. The Lucene90BlockTreeTermsWriter class is used in the implementation of the 10.1 postings codec in Lucene. With the new 10.3 postings format that class is no longer needed, so it has been moved to a test-only location, in order to support backward compatibility testing. In Elasticsearch we were using Lucene90BlockTreeTermsWriter (from Lucene) directly, through our copy of the Lucene 9.0 postings format, namely ES812PostingsFormat. So if you look at ES812PostingsFormat , you should that the imports should now show that we're using our own copy. Additionally, changes are required because of the removal of deprecated methods in IOContext, as well as the override of hints for direct IO. Co-authored-by: Simon Cooper <[email protected]>
1 parent 5e1c8a5 commit 9b12969

File tree

44 files changed

+1455
-208
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+1455
-208
lines changed

benchmarks/src/main/java/org/elasticsearch/benchmark/index/codec/tsdb/TSDBDocValuesMergeBenchmark.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
import org.apache.lucene.util.BytesRef;
2727
import org.elasticsearch.cluster.metadata.DataStream;
2828
import org.elasticsearch.common.logging.LogConfigurator;
29-
import org.elasticsearch.index.codec.Elasticsearch900Lucene101Codec;
29+
import org.elasticsearch.index.codec.Elasticsearch92Lucene103Codec;
3030
import org.elasticsearch.index.codec.tsdb.es819.ES819TSDBDocValuesFormat;
3131
import org.openjdk.jmh.annotations.Benchmark;
3232
import org.openjdk.jmh.annotations.BenchmarkMode;
@@ -63,7 +63,6 @@
6363
public class TSDBDocValuesMergeBenchmark {
6464

6565
static {
66-
// For Elasticsearch900Lucene101Codec:
6766
LogConfigurator.loadLog4jPlugins();
6867
LogConfigurator.configureESLogging();
6968
LogConfigurator.setNodeName("test");
@@ -259,7 +258,7 @@ private static IndexWriterConfig createIndexWriterConfig(boolean optimizedMergeE
259258
config.setLeafSorter(DataStream.TIMESERIES_LEAF_READERS_SORTER);
260259
config.setMergePolicy(new LogByteSizeMergePolicy());
261260
var docValuesFormat = new ES819TSDBDocValuesFormat(4096, optimizedMergeEnabled);
262-
config.setCodec(new Elasticsearch900Lucene101Codec() {
261+
config.setCodec(new Elasticsearch92Lucene103Codec() {
263262

264263
@Override
265264
public DocValuesFormat getDocValuesFormatForField(String field) {

server/src/internalClusterTest/java/org/elasticsearch/search/simple/SimpleSearchIT.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -261,20 +261,22 @@ public void testSimpleTerminateAfterCount() throws Exception {
261261
ensureGreen();
262262
refresh();
263263

264-
for (int i = 1; i < max; i++) {
264+
// query all but one doc to avoid optimizations that may rewrite to a MatchAllDocs, which simplifies assertions
265+
final int queryMax = max - 1;
266+
for (int i = 1; i < queryMax; i++) {
265267
final int finalI = i;
266268
assertResponse(
267-
prepareSearch("test").setQuery(QueryBuilders.rangeQuery("field").gte(1).lte(max)).setTerminateAfter(i),
269+
prepareSearch("test").setQuery(QueryBuilders.rangeQuery("field").gte(1).lte(queryMax)).setTerminateAfter(i),
268270
response -> {
269271
assertHitCount(response, finalI);
270272
assertTrue(response.isTerminatedEarly());
271273
}
272274
);
273275
}
274276
assertResponse(
275-
prepareSearch("test").setQuery(QueryBuilders.rangeQuery("field").gte(1).lte(max)).setTerminateAfter(2 * max),
277+
prepareSearch("test").setQuery(QueryBuilders.rangeQuery("field").gte(1).lte(queryMax)).setTerminateAfter(2 * max),
276278
response -> {
277-
assertHitCount(response, max);
279+
assertHitCount(response, queryMax);
278280
assertFalse(response.isTerminatedEarly());
279281
}
280282
);

server/src/main/java/module-info.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -461,7 +461,8 @@
461461
org.elasticsearch.index.codec.Elasticsearch814Codec,
462462
org.elasticsearch.index.codec.Elasticsearch816Codec,
463463
org.elasticsearch.index.codec.Elasticsearch900Codec,
464-
org.elasticsearch.index.codec.Elasticsearch900Lucene101Codec;
464+
org.elasticsearch.index.codec.Elasticsearch900Lucene101Codec,
465+
org.elasticsearch.index.codec.Elasticsearch92Lucene103Codec;
465466

466467
provides org.apache.logging.log4j.core.util.ContextDataProvider with org.elasticsearch.common.logging.DynamicContextDataProvider;
467468

server/src/main/java/org/elasticsearch/action/admin/indices/diskusage/IndexDiskUsageAnalyzer.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
package org.elasticsearch.action.admin.indices.diskusage;
1111

1212
import org.apache.logging.log4j.Logger;
13+
import org.apache.lucene.backward_codecs.lucene101.Lucene101PostingsFormat;
1314
import org.apache.lucene.backward_codecs.lucene50.Lucene50PostingsFormat;
1415
import org.apache.lucene.backward_codecs.lucene84.Lucene84PostingsFormat;
1516
import org.apache.lucene.backward_codecs.lucene90.Lucene90PostingsFormat;
@@ -22,7 +23,7 @@
2223
import org.apache.lucene.codecs.PointsReader;
2324
import org.apache.lucene.codecs.StoredFieldsReader;
2425
import org.apache.lucene.codecs.TermVectorsReader;
25-
import org.apache.lucene.codecs.lucene101.Lucene101PostingsFormat;
26+
import org.apache.lucene.codecs.lucene103.Lucene103PostingsFormat;
2627
import org.apache.lucene.index.BinaryDocValues;
2728
import org.apache.lucene.index.ByteVectorValues;
2829
import org.apache.lucene.index.DirectoryReader;
@@ -318,6 +319,9 @@ private static void readProximity(Terms terms, PostingsEnum postings) throws IOE
318319
private static BlockTermState getBlockTermState(TermsEnum termsEnum, BytesRef term) throws IOException {
319320
if (term != null && termsEnum.seekExact(term)) {
320321
final TermState termState = termsEnum.termState();
322+
if (termState instanceof final Lucene103PostingsFormat.IntBlockTermState blockTermState) {
323+
return new BlockTermState(blockTermState.docStartFP, blockTermState.posStartFP, blockTermState.payStartFP);
324+
}
321325
if (termState instanceof final Lucene101PostingsFormat.IntBlockTermState blockTermState) {
322326
return new BlockTermState(blockTermState.docStartFP, blockTermState.posStartFP, blockTermState.payStartFP);
323327
}

server/src/main/java/org/elasticsearch/common/lucene/Lucene.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@
9393

9494
public class Lucene {
9595

96-
public static final String LATEST_CODEC = "Lucene101";
96+
public static final String LATEST_CODEC = "Lucene103";
9797

9898
public static final String SOFT_DELETES_FIELD = "__soft_deletes";
9999

server/src/main/java/org/elasticsearch/index/codec/CodecService.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
import org.apache.lucene.codecs.Codec;
1313
import org.apache.lucene.codecs.FieldInfosFormat;
1414
import org.apache.lucene.codecs.FilterCodec;
15-
import org.apache.lucene.codecs.lucene101.Lucene101Codec;
15+
import org.apache.lucene.codecs.lucene103.Lucene103Codec;
1616
import org.elasticsearch.common.util.BigArrays;
1717
import org.elasticsearch.common.util.FeatureFlag;
1818
import org.elasticsearch.core.Nullable;
@@ -46,7 +46,7 @@ public class CodecService implements CodecProvider {
4646
public CodecService(@Nullable MapperService mapperService, BigArrays bigArrays) {
4747
final var codecs = new HashMap<String, Codec>();
4848

49-
Codec legacyBestSpeedCodec = new LegacyPerFieldMapperCodec(Lucene101Codec.Mode.BEST_SPEED, mapperService, bigArrays);
49+
Codec legacyBestSpeedCodec = new LegacyPerFieldMapperCodec(Lucene103Codec.Mode.BEST_SPEED, mapperService, bigArrays);
5050
if (ZSTD_STORED_FIELDS_FEATURE_FLAG) {
5151
codecs.put(DEFAULT_CODEC, new PerFieldMapperCodec(Zstd814StoredFieldsFormat.Mode.BEST_SPEED, mapperService, bigArrays));
5252
} else {
@@ -58,7 +58,7 @@ public CodecService(@Nullable MapperService mapperService, BigArrays bigArrays)
5858
BEST_COMPRESSION_CODEC,
5959
new PerFieldMapperCodec(Zstd814StoredFieldsFormat.Mode.BEST_COMPRESSION, mapperService, bigArrays)
6060
);
61-
Codec legacyBestCompressionCodec = new LegacyPerFieldMapperCodec(Lucene101Codec.Mode.BEST_COMPRESSION, mapperService, bigArrays);
61+
Codec legacyBestCompressionCodec = new LegacyPerFieldMapperCodec(Lucene103Codec.Mode.BEST_COMPRESSION, mapperService, bigArrays);
6262
codecs.put(LEGACY_BEST_COMPRESSION_CODEC, legacyBestCompressionCodec);
6363

6464
codecs.put(LUCENE_DEFAULT_CODEC, Codec.getDefault());

server/src/main/java/org/elasticsearch/index/codec/Elasticsearch900Lucene101Codec.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@
99

1010
package org.elasticsearch.index.codec;
1111

12+
import org.apache.lucene.backward_codecs.lucene101.Lucene101Codec;
13+
import org.apache.lucene.backward_codecs.lucene101.Lucene101PostingsFormat;
1214
import org.apache.lucene.codecs.DocValuesFormat;
1315
import org.apache.lucene.codecs.KnnVectorsFormat;
1416
import org.apache.lucene.codecs.PostingsFormat;
1517
import org.apache.lucene.codecs.StoredFieldsFormat;
16-
import org.apache.lucene.codecs.lucene101.Lucene101Codec;
17-
import org.apache.lucene.codecs.lucene101.Lucene101PostingsFormat;
1818
import org.apache.lucene.codecs.lucene90.Lucene90DocValuesFormat;
1919
import org.apache.lucene.codecs.lucene99.Lucene99HnswVectorsFormat;
2020
import org.apache.lucene.codecs.perfield.PerFieldKnnVectorsFormat;
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the "Elastic License
4+
* 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side
5+
* Public License v 1"; you may not use this file except in compliance with, at
6+
* your election, the "Elastic License 2.0", the "GNU Affero General Public
7+
* License v3.0 only", or the "Server Side Public License, v 1".
8+
*/
9+
10+
package org.elasticsearch.index.codec;
11+
12+
import org.apache.lucene.codecs.DocValuesFormat;
13+
import org.apache.lucene.codecs.KnnVectorsFormat;
14+
import org.apache.lucene.codecs.PostingsFormat;
15+
import org.apache.lucene.codecs.StoredFieldsFormat;
16+
import org.apache.lucene.codecs.lucene103.Lucene103Codec;
17+
import org.apache.lucene.codecs.lucene103.Lucene103PostingsFormat;
18+
import org.apache.lucene.codecs.lucene90.Lucene90DocValuesFormat;
19+
import org.apache.lucene.codecs.lucene99.Lucene99HnswVectorsFormat;
20+
import org.apache.lucene.codecs.perfield.PerFieldKnnVectorsFormat;
21+
import org.apache.lucene.codecs.perfield.PerFieldPostingsFormat;
22+
import org.elasticsearch.index.codec.perfield.XPerFieldDocValuesFormat;
23+
import org.elasticsearch.index.codec.zstd.Zstd814StoredFieldsFormat;
24+
25+
/**
26+
* Elasticsearch codec as of 9.2 relying on Lucene 10.3. This extends the Lucene 10.3 codec to compressed
27+
* stored fields with ZSTD instead of LZ4/DEFLATE. See {@link Zstd814StoredFieldsFormat}.
28+
*/
29+
public class Elasticsearch92Lucene103Codec extends CodecService.DeduplicateFieldInfosCodec {
30+
31+
static final PostingsFormat DEFAULT_POSTINGS_FORMAT = new Lucene103PostingsFormat();
32+
33+
private final StoredFieldsFormat storedFieldsFormat;
34+
35+
private final PostingsFormat defaultPostingsFormat;
36+
private final PostingsFormat postingsFormat = new PerFieldPostingsFormat() {
37+
@Override
38+
public PostingsFormat getPostingsFormatForField(String field) {
39+
return Elasticsearch92Lucene103Codec.this.getPostingsFormatForField(field);
40+
}
41+
};
42+
43+
private final DocValuesFormat defaultDVFormat;
44+
private final DocValuesFormat docValuesFormat = new XPerFieldDocValuesFormat() {
45+
@Override
46+
public DocValuesFormat getDocValuesFormatForField(String field) {
47+
return Elasticsearch92Lucene103Codec.this.getDocValuesFormatForField(field);
48+
}
49+
};
50+
51+
private final KnnVectorsFormat defaultKnnVectorsFormat;
52+
private final KnnVectorsFormat knnVectorsFormat = new PerFieldKnnVectorsFormat() {
53+
@Override
54+
public KnnVectorsFormat getKnnVectorsFormatForField(String field) {
55+
return Elasticsearch92Lucene103Codec.this.getKnnVectorsFormatForField(field);
56+
}
57+
};
58+
59+
/** Public no-arg constructor, needed for SPI loading at read-time. */
60+
public Elasticsearch92Lucene103Codec() {
61+
this(Zstd814StoredFieldsFormat.Mode.BEST_SPEED);
62+
}
63+
64+
/**
65+
* Constructor. Takes a {@link Zstd814StoredFieldsFormat.Mode} that describes whether to optimize for retrieval speed at the expense of
66+
* worse space-efficiency or vice-versa.
67+
*/
68+
public Elasticsearch92Lucene103Codec(Zstd814StoredFieldsFormat.Mode mode) {
69+
super("Elasticsearch92Lucene103", new Lucene103Codec());
70+
this.storedFieldsFormat = mode.getFormat();
71+
this.defaultPostingsFormat = DEFAULT_POSTINGS_FORMAT;
72+
this.defaultDVFormat = new Lucene90DocValuesFormat();
73+
this.defaultKnnVectorsFormat = new Lucene99HnswVectorsFormat();
74+
}
75+
76+
@Override
77+
public StoredFieldsFormat storedFieldsFormat() {
78+
return storedFieldsFormat;
79+
}
80+
81+
@Override
82+
public final PostingsFormat postingsFormat() {
83+
return postingsFormat;
84+
}
85+
86+
@Override
87+
public final DocValuesFormat docValuesFormat() {
88+
return docValuesFormat;
89+
}
90+
91+
@Override
92+
public final KnnVectorsFormat knnVectorsFormat() {
93+
return knnVectorsFormat;
94+
}
95+
96+
/**
97+
* Returns the postings format that should be used for writing new segments of <code>field</code>.
98+
*
99+
* <p>The default implementation always returns "Lucene912".
100+
*
101+
* <p><b>WARNING:</b> if you subclass, you are responsible for index backwards compatibility:
102+
* future version of Lucene are only guaranteed to be able to read the default implementation,
103+
*/
104+
public PostingsFormat getPostingsFormatForField(String field) {
105+
return defaultPostingsFormat;
106+
}
107+
108+
/**
109+
* Returns the docvalues format that should be used for writing new segments of <code>field</code>
110+
* .
111+
*
112+
* <p>The default implementation always returns "Lucene912".
113+
*
114+
* <p><b>WARNING:</b> if you subclass, you are responsible for index backwards compatibility:
115+
* future version of Lucene are only guaranteed to be able to read the default implementation.
116+
*/
117+
public DocValuesFormat getDocValuesFormatForField(String field) {
118+
return defaultDVFormat;
119+
}
120+
121+
/**
122+
* Returns the vectors format that should be used for writing new segments of <code>field</code>
123+
*
124+
* <p>The default implementation always returns "Lucene912".
125+
*
126+
* <p><b>WARNING:</b> if you subclass, you are responsible for index backwards compatibility:
127+
* future version of Lucene are only guaranteed to be able to read the default implementation.
128+
*/
129+
public KnnVectorsFormat getKnnVectorsFormatForField(String field) {
130+
return defaultKnnVectorsFormat;
131+
}
132+
133+
}

server/src/main/java/org/elasticsearch/index/codec/LegacyPerFieldMapperCodec.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
import org.apache.lucene.codecs.DocValuesFormat;
1414
import org.apache.lucene.codecs.KnnVectorsFormat;
1515
import org.apache.lucene.codecs.PostingsFormat;
16-
import org.apache.lucene.codecs.lucene101.Lucene101Codec;
16+
import org.apache.lucene.codecs.lucene103.Lucene103Codec;
1717
import org.elasticsearch.common.lucene.Lucene;
1818
import org.elasticsearch.common.util.BigArrays;
1919
import org.elasticsearch.index.mapper.MapperService;
@@ -22,11 +22,11 @@
2222
* Legacy version of {@link PerFieldMapperCodec}. This codec is preserved to give an escape hatch in case we encounter issues with new
2323
* changes in {@link PerFieldMapperCodec}.
2424
*/
25-
public final class LegacyPerFieldMapperCodec extends Lucene101Codec {
25+
public final class LegacyPerFieldMapperCodec extends Lucene103Codec {
2626

2727
private final PerFieldFormatSupplier formatSupplier;
2828

29-
public LegacyPerFieldMapperCodec(Lucene101Codec.Mode compressionMode, MapperService mapperService, BigArrays bigArrays) {
29+
public LegacyPerFieldMapperCodec(Lucene103Codec.Mode compressionMode, MapperService mapperService, BigArrays bigArrays) {
3030
super(compressionMode);
3131
this.formatSupplier = new PerFieldFormatSupplier(mapperService, bigArrays);
3232
// If the below assertion fails, it is a sign that Lucene released a new codec. You must create a copy of the current Elasticsearch

server/src/main/java/org/elasticsearch/index/codec/PerFieldFormatSupplier.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
import org.apache.lucene.codecs.DocValuesFormat;
1313
import org.apache.lucene.codecs.KnnVectorsFormat;
1414
import org.apache.lucene.codecs.PostingsFormat;
15-
import org.apache.lucene.codecs.lucene101.Lucene101PostingsFormat;
1615
import org.apache.lucene.codecs.lucene90.Lucene90DocValuesFormat;
1716
import org.apache.lucene.codecs.lucene99.Lucene99HnswVectorsFormat;
1817
import org.elasticsearch.common.util.BigArrays;
@@ -34,13 +33,12 @@
3433
* vectors.
3534
*/
3635
public class PerFieldFormatSupplier {
37-
public static final FeatureFlag USE_LUCENE101_POSTINGS_FORMAT = new FeatureFlag("use_lucene101_postings_format");
36+
public static final FeatureFlag USE_DEFAULT_LUCENE_POSTINGS_FORMAT = new FeatureFlag("use_default_lucene_postings_format");
3837

3938
private static final DocValuesFormat docValuesFormat = new Lucene90DocValuesFormat();
4039
private static final KnnVectorsFormat knnVectorsFormat = new Lucene99HnswVectorsFormat();
4140
private static final ES819TSDBDocValuesFormat tsdbDocValuesFormat = new ES819TSDBDocValuesFormat();
4241
private static final ES812PostingsFormat es812PostingsFormat = new ES812PostingsFormat();
43-
private static final Lucene101PostingsFormat lucene101PostingsFormat = new Lucene101PostingsFormat();
4442
private static final PostingsFormat completionPostingsFormat = PostingsFormat.forName("Completion101");
4543

4644
private final ES87BloomFilterPostingsFormat bloomFilterPostingsFormat;
@@ -53,10 +51,10 @@ public PerFieldFormatSupplier(MapperService mapperService, BigArrays bigArrays)
5351
this.bloomFilterPostingsFormat = new ES87BloomFilterPostingsFormat(bigArrays, this::internalGetPostingsFormatForField);
5452

5553
if (mapperService != null
56-
&& USE_LUCENE101_POSTINGS_FORMAT.isEnabled()
57-
&& mapperService.getIndexSettings().getIndexVersionCreated().onOrAfter(IndexVersions.USE_LUCENE101_POSTINGS_FORMAT)
54+
&& USE_DEFAULT_LUCENE_POSTINGS_FORMAT.isEnabled()
55+
&& mapperService.getIndexSettings().getIndexVersionCreated().onOrAfter(IndexVersions.UPGRADE_TO_LUCENE_10_3_0)
5856
&& mapperService.getIndexSettings().getMode() == IndexMode.STANDARD) {
59-
defaultPostingsFormat = lucene101PostingsFormat;
57+
defaultPostingsFormat = Elasticsearch92Lucene103Codec.DEFAULT_POSTINGS_FORMAT;
6058
} else {
6159
// our own posting format using PFOR
6260
defaultPostingsFormat = es812PostingsFormat;

server/src/main/java/org/elasticsearch/index/codec/PerFieldMapperCodec.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
* per index in real time via the mapping API. If no specific postings format or vector format is
2727
* configured for a specific field the default postings or vector format is used.
2828
*/
29-
public final class PerFieldMapperCodec extends Elasticsearch900Lucene101Codec {
29+
public final class PerFieldMapperCodec extends Elasticsearch92Lucene103Codec {
3030

3131
private final PerFieldFormatSupplier formatSupplier;
3232

server/src/main/java/org/elasticsearch/index/codec/postings/ES812PostingsFormat.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
*/
2020
package org.elasticsearch.index.codec.postings;
2121

22+
import org.apache.lucene.backward_codecs.lucene90.blocktree.Lucene90BlockTreeTermsReader;
2223
import org.apache.lucene.codecs.BlockTermState;
2324
import org.apache.lucene.codecs.CodecUtil;
2425
import org.apache.lucene.codecs.FieldsConsumer;
@@ -27,8 +28,6 @@
2728
import org.apache.lucene.codecs.PostingsFormat;
2829
import org.apache.lucene.codecs.PostingsReaderBase;
2930
import org.apache.lucene.codecs.PostingsWriterBase;
30-
import org.apache.lucene.codecs.lucene90.blocktree.Lucene90BlockTreeTermsReader;
31-
import org.apache.lucene.codecs.lucene90.blocktree.Lucene90BlockTreeTermsWriter;
3231
import org.apache.lucene.index.IndexOptions;
3332
import org.apache.lucene.index.SegmentReadState;
3433
import org.apache.lucene.index.SegmentWriteState;
@@ -100,7 +99,7 @@
10099
* <dd><b>Term Dictionary</b>
101100
* <p>The .tim file contains the list of terms in each field along with per-term statistics
102101
* (such as docfreq) and pointers to the frequencies, positions, payload and skip data in the
103-
* .doc, .pos, and .pay files. See {@link Lucene90BlockTreeTermsWriter} for more details on
102+
* .doc, .pos, and .pay files. See {@link Lucene90BlockTreeTermsReader} for more details on
104103
* the format.
105104
* <p>NOTE: The term dictionary can plug into different postings implementations: the postings
106105
* writer/reader are actually responsible for encoding and decoding the PostingsHeader and
@@ -155,7 +154,7 @@
155154
* <dl>
156155
* <dd><b>Term Index</b>
157156
* <p>The .tip file contains an index into the term dictionary, so that it can be accessed
158-
* randomly. See {@link Lucene90BlockTreeTermsWriter} for more details on the format.
157+
* randomly. See {@link Lucene90BlockTreeTermsReader} for more details on the format.
159158
* </dl>
160159
*
161160
* <a id="Frequencies"></a>
@@ -343,7 +342,7 @@
343342
* </dl>
344343
*
345344
*/
346-
public final class ES812PostingsFormat extends PostingsFormat {
345+
public class ES812PostingsFormat extends PostingsFormat {
347346

348347
/**
349348
* Filename extension for document number, frequencies, and skip data. See chapter: <a

0 commit comments

Comments
 (0)