diff --git a/server/src/main/java/org/elasticsearch/index/IndexVersions.java b/server/src/main/java/org/elasticsearch/index/IndexVersions.java index 2e464afa72b76..dd2bcc3d6a883 100644 --- a/server/src/main/java/org/elasticsearch/index/IndexVersions.java +++ b/server/src/main/java/org/elasticsearch/index/IndexVersions.java @@ -180,6 +180,7 @@ private static Version parseUnchecked(String version) { public static final IndexVersion SPARSE_VECTOR_PRUNING_INDEX_OPTIONS_SUPPORT = def(9_031_0_00, Version.LUCENE_10_2_2); public static final IndexVersion DEFAULT_DENSE_VECTOR_TO_BBQ_HNSW = def(9_032_0_00, Version.LUCENE_10_2_2); public static final IndexVersion MATCH_ONLY_TEXT_STORED_AS_BYTES = def(9_033_0_00, Version.LUCENE_10_2_2); + public static final IndexVersion USE_819_TSDB_DOC_VALUES_FORMAT = def(9_034_0_00, Version.LUCENE_10_2_2); /* * STOP! READ THIS FIRST! No, really, diff --git a/server/src/main/java/org/elasticsearch/index/codec/PerFieldFormatSupplier.java b/server/src/main/java/org/elasticsearch/index/codec/PerFieldFormatSupplier.java index ecb0d6d5eb3ca..b508a978ffdbd 100644 --- a/server/src/main/java/org/elasticsearch/index/codec/PerFieldFormatSupplier.java +++ b/server/src/main/java/org/elasticsearch/index/codec/PerFieldFormatSupplier.java @@ -20,6 +20,7 @@ import org.elasticsearch.index.IndexVersions; import org.elasticsearch.index.codec.bloomfilter.ES87BloomFilterPostingsFormat; import org.elasticsearch.index.codec.postings.ES812PostingsFormat; +import org.elasticsearch.index.codec.tsdb.ES87TSDBDocValuesFormat; import org.elasticsearch.index.codec.tsdb.es819.ES819TSDBDocValuesFormat; import org.elasticsearch.index.mapper.CompletionFieldMapper; import org.elasticsearch.index.mapper.IdFieldMapper; @@ -35,7 +36,8 @@ public class PerFieldFormatSupplier { private static final DocValuesFormat docValuesFormat = new Lucene90DocValuesFormat(); private static final KnnVectorsFormat knnVectorsFormat = new Lucene99HnswVectorsFormat(); - private static final ES819TSDBDocValuesFormat tsdbDocValuesFormat = new ES819TSDBDocValuesFormat(); + private static final ES87TSDBDocValuesFormat es87TsdbDocValuesFormat = new ES87TSDBDocValuesFormat(); + private static final ES819TSDBDocValuesFormat es819TsdbDocValuesFormat = new ES819TSDBDocValuesFormat(); private static final ES812PostingsFormat es812PostingsFormat = new ES812PostingsFormat(); private static final PostingsFormat completionPostingsFormat = PostingsFormat.forName("Completion101"); @@ -43,6 +45,7 @@ public class PerFieldFormatSupplier { private final MapperService mapperService; private final PostingsFormat defaultPostingsFormat; + private final DocValuesFormat defaultTsdbDocValuesFormat; public PerFieldFormatSupplier(MapperService mapperService, BigArrays bigArrays) { this.mapperService = mapperService; @@ -56,6 +59,12 @@ public PerFieldFormatSupplier(MapperService mapperService, BigArrays bigArrays) // our own posting format using PFOR defaultPostingsFormat = es812PostingsFormat; } + if (mapperService != null + && mapperService.getIndexSettings().getIndexVersionCreated().onOrAfter(IndexVersions.USE_819_TSDB_DOC_VALUES_FORMAT)) { + defaultTsdbDocValuesFormat = es819TsdbDocValuesFormat; + } else { + defaultTsdbDocValuesFormat = es87TsdbDocValuesFormat; + } } public PostingsFormat getPostingsFormatForField(String field) { @@ -106,7 +115,7 @@ public KnnVectorsFormat getKnnVectorsFormatForField(String field) { public DocValuesFormat getDocValuesFormatForField(String field) { if (useTSDBDocValuesFormat(field)) { - return tsdbDocValuesFormat; + return defaultTsdbDocValuesFormat; } return docValuesFormat; } diff --git a/server/src/test/java/org/elasticsearch/index/codec/tsdb/ES87TSDBDocValuesConsumer.java b/server/src/main/java/org/elasticsearch/index/codec/tsdb/ES87TSDBDocValuesConsumer.java similarity index 100% rename from server/src/test/java/org/elasticsearch/index/codec/tsdb/ES87TSDBDocValuesConsumer.java rename to server/src/main/java/org/elasticsearch/index/codec/tsdb/ES87TSDBDocValuesConsumer.java diff --git a/server/src/main/java/org/elasticsearch/index/codec/tsdb/ES87TSDBDocValuesFormat.java b/server/src/main/java/org/elasticsearch/index/codec/tsdb/ES87TSDBDocValuesFormat.java index e209520859819..690f325252e53 100644 --- a/server/src/main/java/org/elasticsearch/index/codec/tsdb/ES87TSDBDocValuesFormat.java +++ b/server/src/main/java/org/elasticsearch/index/codec/tsdb/ES87TSDBDocValuesFormat.java @@ -93,7 +93,7 @@ public ES87TSDBDocValuesFormat(int skipIndexIntervalSize) { @Override public DocValuesConsumer fieldsConsumer(SegmentWriteState state) throws IOException { - throw new UnsupportedOperationException("writing es87 doc values is no longer supported"); + return new ES87TSDBDocValuesConsumer(state, skipIndexIntervalSize, DATA_CODEC, DATA_EXTENSION, META_CODEC, META_EXTENSION); } @Override diff --git a/server/src/main/java/org/elasticsearch/index/codec/tsdb/es819/ES819TSDBDocValuesFormat.java b/server/src/main/java/org/elasticsearch/index/codec/tsdb/es819/ES819TSDBDocValuesFormat.java index 1a937e75ad5f9..6e2203f4519d6 100644 --- a/server/src/main/java/org/elasticsearch/index/codec/tsdb/es819/ES819TSDBDocValuesFormat.java +++ b/server/src/main/java/org/elasticsearch/index/codec/tsdb/es819/ES819TSDBDocValuesFormat.java @@ -14,6 +14,8 @@ import org.apache.lucene.index.SegmentReadState; import org.apache.lucene.index.SegmentWriteState; import org.elasticsearch.core.SuppressForbidden; +import org.elasticsearch.index.IndexVersion; +import org.elasticsearch.index.IndexVersions; import java.io.IOException; @@ -139,4 +141,9 @@ public DocValuesConsumer fieldsConsumer(SegmentWriteState state) throws IOExcept public DocValuesProducer fieldsProducer(SegmentReadState state) throws IOException { return new ES819TSDBDocValuesProducer(state, DATA_CODEC, DATA_EXTENSION, META_CODEC, META_EXTENSION); } + + public static ES819TSDBDocValuesFormat load(IndexVersion indexVersion) { + boolean enableOptimizedMerge = indexVersion.onOrAfter(IndexVersions.USE_819_TSDB_DOC_VALUES_FORMAT); + return new ES819TSDBDocValuesFormat(DEFAULT_SKIP_INDEX_INTERVAL_SIZE, enableOptimizedMerge); + } }