Skip to content

Commit f98c894

Browse files
committed
explicit set default index_options if null
1 parent 7151d4a commit f98c894

File tree

2 files changed

+55
-21
lines changed

2 files changed

+55
-21
lines changed

server/src/main/java/org/elasticsearch/index/mapper/vectors/SparseVectorFieldMapper.java

Lines changed: 34 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,16 @@ public static class Builder extends FieldMapper.Builder {
105105
Objects::toString
106106
).acceptsNull();
107107

108+
private final MappingParserContext mappingParserContext;
109+
108110
public Builder(String name) {
109111
super(name);
112+
mappingParserContext = null;
113+
}
114+
115+
public Builder(String name, @Nullable MappingParserContext mappingParserContext) {
116+
super(name);
117+
this.mappingParserContext = mappingParserContext;
110118
}
111119

112120
public Builder setStored(boolean value) {
@@ -121,9 +129,17 @@ protected Parameter<?>[] getParameters() {
121129

122130
@Override
123131
public SparseVectorFieldMapper build(MapperBuilderContext context) {
132+
IndexOptions builderIndexOptions = indexOptions.getValue();
133+
if (builderIndexOptions == null &&
134+
mappingParserContext != null &&
135+
shouldHaveDefaultPruningConfig(mappingParserContext.indexVersionCreated())
136+
) {
137+
builderIndexOptions = new IndexOptions(true, new TokenPruningConfig());
138+
}
139+
124140
return new SparseVectorFieldMapper(
125141
leafName(),
126-
new SparseVectorFieldType(context.buildFullName(leafName()), stored.getValue(), meta.getValue(), indexOptions.getValue()),
142+
new SparseVectorFieldType(context.buildFullName(leafName()), stored.getValue(), meta.getValue(), builderIndexOptions),
127143
builderParams(this, context)
128144
);
129145
}
@@ -171,7 +187,7 @@ private static SparseVectorFieldMapper.IndexOptions parseIndexOptions(MappingPar
171187
throw new IllegalArgumentException(ERROR_MESSAGE_8X);
172188
}
173189

174-
return new Builder(n);
190+
return new Builder(n, c);
175191
}, notInMultiFields(CONTENT_TYPE));
176192

177193
public static final class SparseVectorFieldType extends MappedFieldType {
@@ -270,20 +286,7 @@ public Query finalizeSparseVectorQuery(
270286

271287
private TokenPruningConfig getDefaultPruningConfig(SearchExecutionContext context) {
272288
IndexVersion indexVersion = context.indexVersionCreated();
273-
274-
if (indexVersion.onOrAfter(SPARSE_VECTOR_PRUNING_INDEX_OPTIONS_VERSION)) {
275-
// default pruning for 9.1.0+ is true for this index
276-
return new TokenPruningConfig();
277-
}
278-
279-
if (indexVersion.between(SPARSE_VECTOR_PRUNING_INDEX_OPTIONS_VERSION_8_X, IndexVersions.UPGRADE_TO_LUCENE_10_0_0)) {
280-
// default pruning for 8.19.0+ is true for this index
281-
return new TokenPruningConfig();
282-
}
283-
284-
// the index version is before we added index_options support
285-
// so pruning is off by default
286-
return null;
289+
return (shouldHaveDefaultPruningConfig(indexVersion)) ? new TokenPruningConfig() : null;
287290
}
288291

289292
private static String indexedValueForSearch(Object value) {
@@ -313,7 +316,7 @@ public Map<String, NamedAnalyzer> indexAnalyzers() {
313316

314317
@Override
315318
public FieldMapper.Builder getMergeBuilder() {
316-
return new Builder(leafName()).init(this);
319+
return new Builder(leafName(), null).init(this);
317320
}
318321

319322
@Override
@@ -391,6 +394,20 @@ protected String contentType() {
391394
return CONTENT_TYPE;
392395
}
393396

397+
private static boolean shouldHaveDefaultPruningConfig(IndexVersion indexVersion) {
398+
if (indexVersion.onOrAfter(SPARSE_VECTOR_PRUNING_INDEX_OPTIONS_VERSION)) {
399+
// default pruning for 9.1.0+ is true for this index
400+
return true;
401+
}
402+
403+
// default pruning for 8.19.0+ is true for this index
404+
if (indexVersion.between(SPARSE_VECTOR_PRUNING_INDEX_OPTIONS_VERSION_8_X, IndexVersions.UPGRADE_TO_LUCENE_10_0_0)) {
405+
return true;
406+
}
407+
408+
return false;
409+
}
410+
394411
private static class SparseVectorValueFetcher implements ValueFetcher {
395412
private final String fieldName;
396413
private TermVectors termVectors;

server/src/test/java/org/elasticsearch/index/mapper/vectors/SparseVectorFieldMapperTests.java

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,12 @@
2929
import org.elasticsearch.index.mapper.DocumentMapper;
3030
import org.elasticsearch.index.mapper.DocumentParsingException;
3131
import org.elasticsearch.index.mapper.MappedFieldType;
32+
import org.elasticsearch.index.mapper.Mapper;
3233
import org.elasticsearch.index.mapper.MapperParsingException;
3334
import org.elasticsearch.index.mapper.MapperService;
3435
import org.elasticsearch.index.mapper.MapperTestCase;
3536
import org.elasticsearch.index.mapper.ParsedDocument;
37+
import org.elasticsearch.index.mapper.SourceToParse;
3638
import org.elasticsearch.index.query.SearchExecutionContext;
3739
import org.elasticsearch.inference.WeightedToken;
3840
import org.elasticsearch.search.lookup.Source;
@@ -51,8 +53,10 @@
5153
import java.util.List;
5254
import java.util.Map;
5355

56+
import static org.elasticsearch.index.IndexVersions.UPGRADE_TO_LUCENE_10_0_0;
5457
import static org.elasticsearch.index.mapper.vectors.SparseVectorFieldMapper.NEW_SPARSE_VECTOR_INDEX_VERSION;
5558
import static org.elasticsearch.index.mapper.vectors.SparseVectorFieldMapper.PREVIOUS_SPARSE_VECTOR_INDEX_VERSION;
59+
import static org.elasticsearch.index.mapper.vectors.SparseVectorFieldMapper.SPARSE_VECTOR_PRUNING_INDEX_OPTIONS_VERSION;
5660
import static org.elasticsearch.xcontent.XContentFactory.jsonBuilder;
5761
import static org.hamcrest.Matchers.containsString;
5862
import static org.hamcrest.Matchers.equalTo;
@@ -78,7 +82,7 @@ protected void minimalMapping(XContentBuilder b) throws IOException {
7882
b.field("type", "sparse_vector");
7983
}
8084

81-
protected void mappingWithIndexOptions(XContentBuilder b) throws IOException {
85+
protected void minimalMappingWithExplicitIndexOptions(XContentBuilder b) throws IOException {
8286
b.field("type", "sparse_vector");
8387
b.startObject("index_options");
8488
{
@@ -131,7 +135,7 @@ private static int getFrequency(TokenStream tk) throws IOException {
131135

132136
public void testDefaults() throws Exception {
133137
DocumentMapper mapper = createDocumentMapper(fieldMapping(this::minimalMapping));
134-
assertEquals(Strings.toString(fieldMapping(this::minimalMapping)), mapper.mappingSource().toString());
138+
assertEquals(Strings.toString(fieldMapping(this::minimalMappingWithExplicitIndexOptions)), mapper.mappingSource().toString());
135139

136140
ParsedDocument doc1 = mapper.parse(source(this::writeField));
137141

@@ -155,6 +159,19 @@ public void testDefaults() throws Exception {
155159
assertTrue(freq1 < freq2);
156160
}
157161

162+
public void testMappingWithoutIndexOptionsUsesDefaults() throws Exception {
163+
DocumentMapper mapper = createDocumentMapper(fieldMapping(this::minimalMapping));
164+
assertEquals(Strings.toString(fieldMapping(this::minimalMappingWithExplicitIndexOptions)), mapper.mappingSource().toString());
165+
166+
IndexVersion preIndexOptionsVersion = IndexVersionUtils.randomVersionBetween(
167+
random(),
168+
UPGRADE_TO_LUCENE_10_0_0,
169+
SPARSE_VECTOR_PRUNING_INDEX_OPTIONS_VERSION
170+
);
171+
DocumentMapper previousMapper = createDocumentMapper(preIndexOptionsVersion, fieldMapping(this::minimalMapping));
172+
assertEquals(Strings.toString(fieldMapping(this::minimalMapping)), previousMapper.mappingSource().toString());
173+
}
174+
158175
public void testDotInFieldName() throws Exception {
159176
DocumentMapper mapper = createDocumentMapper(fieldMapping(this::minimalMapping));
160177
ParsedDocument parsedDocument = mapper.parse(source(b -> b.field("field", Map.of("foo.bar", 10, "foobar", 20))));
@@ -579,7 +596,7 @@ public void testTypeQueryFinalizationDefaultsPreviousVersion() throws Exception
579596

580597
public void testTypeQueryFinalizationWithIndexExplicit() throws Exception {
581598
IndexVersion version = IndexVersion.current();
582-
MapperService mapperService = createMapperService(version, fieldMapping(this::mappingWithIndexOptions));
599+
MapperService mapperService = createMapperService(version, fieldMapping(this::minimalMapping));
583600

584601
// query should be pruned via explicit index options
585602
performTypeQueryFinalizationTest(
@@ -758,7 +775,7 @@ private MapperService getMapperServiceForRandomizedFinalizationTest(
758775
return createMapperService(indexVersion, fieldMapping(this::mappingWithIndexOptionsPruneFalse));
759776
}
760777

761-
return createMapperService(indexVersion, fieldMapping(this::mappingWithIndexOptions));
778+
return createMapperService(indexVersion, fieldMapping(this::minimalMapping));
762779
}
763780

764781
private static List<WeightedToken> QUERY_VECTORS = List.of(

0 commit comments

Comments
 (0)