Skip to content

Commit ddd666c

Browse files
committed
more wipp, some :server:test tests failing
1 parent 07a3629 commit ddd666c

File tree

5 files changed

+76
-51
lines changed

5 files changed

+76
-51
lines changed

modules/mapper-extras/src/main/java/org/elasticsearch/index/mapper/extras/MatchOnlyTextFieldMapper.java

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,8 @@ public static class Builder extends FieldMapper.Builder {
9595

9696
private final Parameter<Map<String, String>> meta = Parameter.metaParam();
9797

98-
private final TextParams.Analyzers analyzers;
98+
final TextParams.AnalyzerParameters analyzers;
99+
final IndexAnalyzers indexAnalyzers;
99100

100101
public Builder(String name, IndexAnalyzers indexAnalyzers) {
101102
this(name, Version.CURRENT, indexAnalyzers);
@@ -104,10 +105,9 @@ public Builder(String name, IndexAnalyzers indexAnalyzers) {
104105
public Builder(String name, Version indexCreatedVersion, IndexAnalyzers indexAnalyzers) {
105106
super(name);
106107
this.indexCreatedVersion = indexCreatedVersion;
107-
this.analyzers = new TextParams.Analyzers(
108-
indexAnalyzers,
109-
m -> ((MatchOnlyTextFieldMapper) m).indexAnalyzer,
110-
m -> ((MatchOnlyTextFieldMapper) m).positionIncrementGap,
108+
this.indexAnalyzers = indexAnalyzers;
109+
this.analyzers = new TextParams.AnalyzerParameters(
110+
m -> ((MatchOnlyTextFieldMapper) m).analyzerConfiguration,
111111
indexCreatedVersion
112112
);
113113
}
@@ -117,24 +117,24 @@ protected Parameter<?>[] getParameters() {
117117
return new Parameter<?>[] { meta };
118118
}
119119

120-
private MatchOnlyTextFieldType buildFieldType(MapperBuilderContext context) {
121-
NamedAnalyzer searchAnalyzer = analyzers.getSearchAnalyzer();
122-
NamedAnalyzer searchQuoteAnalyzer = analyzers.getSearchQuoteAnalyzer();
123-
NamedAnalyzer indexAnalyzer = analyzers.getIndexAnalyzer();
120+
private MatchOnlyTextFieldType buildFieldType(MapperBuilderContext context, TextParams.Analyzers analyzers) {
121+
NamedAnalyzer searchAnalyzer = analyzers.searchAnalyzer();
122+
NamedAnalyzer searchQuoteAnalyzer = analyzers.searchQuoteAnalyzer();
123+
NamedAnalyzer indexAnalyzer = analyzers.indexAnalyzer();
124124
TextSearchInfo tsi = new TextSearchInfo(Defaults.FIELD_TYPE, null, searchAnalyzer, searchQuoteAnalyzer);
125-
MatchOnlyTextFieldType ft = new MatchOnlyTextFieldType(
125+
return new MatchOnlyTextFieldType(
126126
context.buildFullName(name),
127127
tsi,
128128
indexAnalyzer,
129129
context.isSourceSynthetic(),
130130
meta.getValue()
131131
);
132-
return ft;
133132
}
134133

135134
@Override
136135
public MatchOnlyTextFieldMapper build(MapperBuilderContext context) {
137-
MatchOnlyTextFieldType tft = buildFieldType(context);
136+
TextParams.Analyzers analyzers = this.analyzers.buildAnalyzers(this.indexAnalyzers);
137+
MatchOnlyTextFieldType tft = buildFieldType(context, analyzers);
138138
MultiFields multiFields = multiFieldsBuilder.build(this, context);
139139
return new MatchOnlyTextFieldMapper(
140140
name,
@@ -143,6 +143,7 @@ public MatchOnlyTextFieldMapper build(MapperBuilderContext context) {
143143
multiFields,
144144
copyTo.build(),
145145
context.isSourceSynthetic(),
146+
analyzers,
146147
this
147148
);
148149
}
@@ -359,9 +360,9 @@ private String storedFieldNameForSyntheticSource() {
359360
private final Version indexCreatedVersion;
360361
private final IndexAnalyzers indexAnalyzers;
361362
private final NamedAnalyzer indexAnalyzer;
362-
private final int positionIncrementGap;
363363
private final boolean storeSource;
364364
private final FieldType fieldType;
365+
private final TextParams.AnalyzerConfiguration analyzerConfiguration;
365366

366367
private MatchOnlyTextFieldMapper(
367368
String simpleName,
@@ -370,16 +371,17 @@ private MatchOnlyTextFieldMapper(
370371
MultiFields multiFields,
371372
CopyTo copyTo,
372373
boolean storeSource,
374+
TextParams.Analyzers analyzers,
373375
Builder builder
374376
) {
375377
super(simpleName, mappedFieldType, multiFields, copyTo, false, null);
376378
assert mappedFieldType.getTextSearchInfo().isTokenized();
377379
assert mappedFieldType.hasDocValues() == false;
378380
this.fieldType = fieldType;
379381
this.indexCreatedVersion = builder.indexCreatedVersion;
380-
this.indexAnalyzers = builder.analyzers.indexAnalyzers;
381-
this.indexAnalyzer = builder.analyzers.getIndexAnalyzer();
382-
this.positionIncrementGap = builder.analyzers.positionIncrementGap.getValue();
382+
this.indexAnalyzers = builder.indexAnalyzers;
383+
this.indexAnalyzer = analyzers.indexAnalyzer();
384+
this.analyzerConfiguration = analyzers.configuration();
383385
this.storeSource = storeSource;
384386
}
385387

modules/mapper-extras/src/main/java/org/elasticsearch/index/mapper/extras/SearchAsYouTypeFieldMapper.java

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,8 @@ public static class Builder extends FieldMapper.Builder {
133133
}
134134
}).alwaysSerialize();
135135

136-
final TextParams.Analyzers analyzers;
136+
final IndexAnalyzers indexAnalyzers;
137+
final TextParams.AnalyzerParameters analyzers;
137138
final Parameter<SimilarityProvider> similarity = TextParams.similarity(m -> builder(m).similarity.get());
138139

139140
final Parameter<String> indexOptions = TextParams.textIndexOptions(m -> builder(m).indexOptions.get());
@@ -147,10 +148,9 @@ public static class Builder extends FieldMapper.Builder {
147148
public Builder(String name, Version indexCreatedVersion, IndexAnalyzers indexAnalyzers) {
148149
super(name);
149150
this.indexCreatedVersion = indexCreatedVersion;
150-
this.analyzers = new TextParams.Analyzers(
151-
indexAnalyzers,
152-
m -> builder(m).analyzers.getIndexAnalyzer(),
153-
m -> builder(m).analyzers.positionIncrementGap.getValue(),
151+
this.indexAnalyzers = indexAnalyzers;
152+
this.analyzers = new TextParams.AnalyzerParameters(
153+
m -> ((SearchAsYouTypeFieldMapper) m).analyzerConfiguration,
154154
indexCreatedVersion
155155
);
156156
}
@@ -183,15 +183,16 @@ public SearchAsYouTypeFieldMapper build(MapperBuilderContext context) {
183183

184184
Map<String, NamedAnalyzer> indexAnalyzers = new HashMap<>();
185185

186-
NamedAnalyzer indexAnalyzer = analyzers.getIndexAnalyzer();
187-
NamedAnalyzer searchAnalyzer = analyzers.getSearchAnalyzer();
186+
TextParams.Analyzers analyzers = this.analyzers.buildAnalyzers(this.indexAnalyzers);
187+
NamedAnalyzer indexAnalyzer = analyzers.indexAnalyzer();
188+
NamedAnalyzer searchAnalyzer = analyzers.searchAnalyzer();
188189

189190
SearchAsYouTypeFieldType ft = new SearchAsYouTypeFieldType(
190191
context.buildFullName(name),
191192
fieldType,
192193
similarity.getValue(),
193-
analyzers.getSearchAnalyzer(),
194-
analyzers.getSearchQuoteAnalyzer(),
194+
analyzers.searchAnalyzer(),
195+
analyzers.searchQuoteAnalyzer(),
195196
meta.getValue()
196197
);
197198

@@ -267,6 +268,7 @@ public SearchAsYouTypeFieldMapper build(MapperBuilderContext context) {
267268
prefixFieldMapper,
268269
shingleFieldMappers,
269270
multiFieldsBuilder.build(this, context),
271+
analyzers.configuration(),
270272
this
271273
);
272274
}
@@ -666,6 +668,7 @@ public SpanQuery spanPrefixQuery(String value, SpanMultiTermQueryWrapper.SpanRew
666668
private final PrefixFieldMapper prefixField;
667669
private final ShingleFieldMapper[] shingleFields;
668670
private final Builder builder;
671+
private final TextParams.AnalyzerConfiguration analyzerConfiguration;
669672

670673
private final Map<String, NamedAnalyzer> indexAnalyzers;
671674

@@ -677,6 +680,7 @@ public SearchAsYouTypeFieldMapper(
677680
PrefixFieldMapper prefixField,
678681
ShingleFieldMapper[] shingleFields,
679682
MultiFields multiFields,
683+
TextParams.AnalyzerConfiguration analyzerConfiguration,
680684
Builder builder
681685
) {
682686
super(simpleName, mappedFieldType, multiFields, copyTo, false, null);
@@ -685,6 +689,7 @@ public SearchAsYouTypeFieldMapper(
685689
this.maxShingleSize = builder.maxShingleSize.getValue();
686690
this.builder = builder;
687691
this.indexAnalyzers = Map.copyOf(indexAnalyzers);
692+
this.analyzerConfiguration = analyzerConfiguration;
688693
}
689694

690695
@Override
@@ -721,7 +726,7 @@ protected String contentType() {
721726
}
722727

723728
public FieldMapper.Builder getMergeBuilder() {
724-
return new Builder(simpleName(), builder.indexCreatedVersion, builder.analyzers.indexAnalyzers).init(this);
729+
return new Builder(simpleName(), builder.indexCreatedVersion, builder.indexAnalyzers).init(this);
725730
}
726731

727732
public static String getShingleFieldName(String parentField, int shingleSize) {

server/src/main/java/org/elasticsearch/index/mapper/TextParams.java

Lines changed: 38 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -46,52 +46,61 @@ private TextParams() {}
4646

4747
public record AnalyzerConfiguration(String indexAnalyzer, String searchAnalyzer, String searchQuoteAnalyzer, int posIncrementGap) {
4848

49-
public Analyzers buildAnalyzers(IndexAnalyzers indexAnalyzers) {
49+
public Analyzers buildAnalyzers(IndexAnalyzers indexAnalyzers, boolean isLegacyVersion) {
5050
return new Analyzers(
51-
wrap(buildIndexAnalyzer(indexAnalyzers), AnalysisMode.INDEX_TIME),
52-
wrap(buildSearchAnalyzer(indexAnalyzers), AnalysisMode.SEARCH_TIME),
53-
wrap(buildSearchQuoteAnalyzer(indexAnalyzers), AnalysisMode.SEARCH_TIME),
51+
wrap(buildIndexAnalyzer(indexAnalyzers, isLegacyVersion), AnalysisMode.INDEX_TIME),
52+
wrap(buildSearchAnalyzer(indexAnalyzers, isLegacyVersion), AnalysisMode.SEARCH_TIME),
53+
wrap(buildSearchQuoteAnalyzer(indexAnalyzers, isLegacyVersion), AnalysisMode.SEARCH_TIME),
5454
this
5555
);
5656
}
5757

58-
private NamedAnalyzer buildIndexAnalyzer(IndexAnalyzers indexAnalyzers) {
58+
private NamedAnalyzer buildIndexAnalyzer(IndexAnalyzers indexAnalyzers, boolean isLegacyVersion) {
5959
if (this.indexAnalyzer == null) {
6060
return indexAnalyzers.getDefaultIndexAnalyzer();
6161
}
6262
NamedAnalyzer a = indexAnalyzers.get(this.indexAnalyzer);
6363
if (a == null) {
64+
if (isLegacyVersion) {
65+
return indexAnalyzers.getDefaultIndexAnalyzer();
66+
}
6467
throw new IllegalArgumentException("Unknown analyzer [" + this.indexAnalyzer + "]");
6568
}
6669
return a;
6770
}
6871

69-
private NamedAnalyzer buildSearchAnalyzer(IndexAnalyzers indexAnalyzers) {
72+
private NamedAnalyzer buildSearchAnalyzer(IndexAnalyzers indexAnalyzers, boolean isLegacyVersion) {
7073
if (this.searchAnalyzer == null) {
7174
if (this.indexAnalyzer == null) {
7275
return indexAnalyzers.getDefaultSearchAnalyzer();
7376
}
74-
return indexAnalyzers.get(this.indexAnalyzer); // null check will already have happened in buildIndexAnalyzer
77+
return buildIndexAnalyzer(indexAnalyzers, isLegacyVersion);
7578
}
7679
NamedAnalyzer a = indexAnalyzers.get(this.searchAnalyzer);
7780
if (a == null) {
81+
if (isLegacyVersion) {
82+
return indexAnalyzers.getDefaultSearchAnalyzer();
83+
}
7884
throw new IllegalArgumentException("Unknown analyzer [" + this.searchAnalyzer + "]");
7985
}
8086
return a;
8187
}
8288

83-
private NamedAnalyzer buildSearchQuoteAnalyzer(IndexAnalyzers indexAnalyzers) {
89+
private NamedAnalyzer buildSearchQuoteAnalyzer(IndexAnalyzers indexAnalyzers, boolean isLegacyVersion) {
8490
if (this.searchQuoteAnalyzer == null) {
8591
if (this.searchAnalyzer == null) {
8692
if (this.indexAnalyzer == null) {
8793
return indexAnalyzers.getDefaultSearchQuoteAnalyzer();
8894
}
89-
return indexAnalyzers.get(this.indexAnalyzer); // null checked already in buildIndexAnalyzer
95+
return buildIndexAnalyzer(indexAnalyzers, isLegacyVersion);
9096
}
91-
return indexAnalyzers.get(this.searchAnalyzer); // null checked already in buildSearchAnalyzer
97+
return buildSearchAnalyzer(indexAnalyzers, isLegacyVersion);
9298
}
9399
NamedAnalyzer a = indexAnalyzers.get(this.searchQuoteAnalyzer);
94100
if (a == null) {
101+
if (isLegacyVersion) {
102+
return indexAnalyzers.getDefaultSearchQuoteAnalyzer();
103+
}
95104
throw new IllegalArgumentException("Unknown analyzer [" + this.searchQuoteAnalyzer + "]");
96105
}
97106
return a;
@@ -120,34 +129,45 @@ public static final class AnalyzerParameters {
120129
public final Parameter<String> searchQuoteAnalyzer;
121130
public final Parameter<Integer> positionIncrementGap;
122131

132+
private final Version indexCreatedVersion;
133+
123134
public AnalyzerParameters(
124135
Function<FieldMapper, AnalyzerConfiguration> analyzerInitFunction,
125136
Version indexCreatedVersion
126137
) {
127-
138+
this.indexCreatedVersion = indexCreatedVersion;
128139
this.indexAnalyzer = Parameter.stringParam(
129140
"analyzer",
130-
indexCreatedVersion.isLegacyIndexVersion(),
141+
false, // sort of - see merge validator!
131142
mapper -> analyzerInitFunction.apply(mapper).indexAnalyzer,
132143
null
133144
)
134-
.setSerializerCheck((includeDefaults, isConfigured, value) -> value != null)
145+
.acceptsNull()
146+
.setSerializerCheck((includeDefaults, isConfigured, value) -> includeDefaults || value != null)
135147
.setMergeValidator(
136-
// special case - we allow 'default' to be merged in to an unconfigured analyzer
137-
(previous, toMerge, conflicts) -> Objects.equals(previous, toMerge) || (previous == null && "default".equals(toMerge))
148+
// special cases
149+
// - we allow 'default' to be merged in to an unconfigured analyzer
150+
// - is the index was created a long time ago we allow updates to remove warnings about vanished analyzers
151+
(previous, toMerge, conflicts) -> indexCreatedVersion.isLegacyIndexVersion()
152+
|| Objects.equals(previous, toMerge)
153+
|| (previous == null && "default".equals(toMerge))
138154
);
139155
this.searchAnalyzer = Parameter.stringParam(
140156
"search_analyzer",
141157
true,
142158
mapper -> analyzerInitFunction.apply(mapper).searchAnalyzer,
143159
null
144-
).setSerializerCheck((includeDefaults, isConfigured, value) -> value != null);
160+
)
161+
.acceptsNull()
162+
.setSerializerCheck((includeDefaults, isConfigured, value) -> includeDefaults || value != null);
145163
this.searchQuoteAnalyzer = Parameter.stringParam(
146164
"search_quote_analyzer",
147165
true,
148166
mapper -> analyzerInitFunction.apply(mapper).searchQuoteAnalyzer,
149167
null
150-
).setSerializerCheck((includeDefaults, isConfigured, value) -> value != null);
168+
)
169+
.acceptsNull()
170+
.setSerializerCheck((includeDefaults, isConfigured, value) -> includeDefaults || value != null);
151171
this.positionIncrementGap = Parameter.intParam(
152172
"position_increment_gap",
153173
false,
@@ -167,7 +187,7 @@ public Analyzers buildAnalyzers(IndexAnalyzers indexAnalyzers) {
167187
searchQuoteAnalyzer.get(),
168188
positionIncrementGap.get()
169189
);
170-
return config.buildAnalyzers(indexAnalyzers);
190+
return config.buildAnalyzers(indexAnalyzers, indexCreatedVersion.isLegacyIndexVersion());
171191
}
172192
}
173193

server/src/test/java/org/elasticsearch/cluster/metadata/MetadataIndexTemplateServiceTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ public void testIndexTemplateWithValidateMapping() throws Exception {
212212
List<Throwable> errors = putTemplateDetail(request);
213213
assertThat(errors.size(), equalTo(1));
214214
assertThat(errors.get(0), instanceOf(MapperParsingException.class));
215-
assertThat(errors.get(0).getMessage(), containsString("analyzer [custom_1] has not been configured in mappings"));
215+
assertThat(errors.get(0).getMessage(), containsString("Unknown analyzer [custom_1]"));
216216
}
217217

218218
public void testAliasInvalidFilterInvalidJson() throws Exception {

server/src/test/java/org/elasticsearch/index/mapper/TextFieldMapperTests.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -569,12 +569,10 @@ public void testFrequencyFilter() throws IOException {
569569
assertThat(fieldType.fielddataMinSegmentSize(), equalTo(1000));
570570
}
571571

572-
public void testNullConfigValuesFail() throws MapperParsingException {
573-
Exception e = expectThrows(
574-
MapperParsingException.class,
575-
() -> createDocumentMapper(fieldMapping(b -> b.field("type", "text").field("analyzer", (String) null)))
576-
);
577-
assertThat(e.getMessage(), containsString("[analyzer] on mapper [field] of type [text] must not have a [null] value"));
572+
public void testNullConfigValuesUseDefaults() throws IOException {
573+
MapperService mapperService = createMapperService(fieldMapping(b -> b.field("type", "text").field("analyzer", (String) null)));
574+
TextFieldMapper m = (TextFieldMapper) mapperService.mappingLookup().getMapper("field");
575+
assertEquals("default", m.indexAnalyzers().get("field").name());
578576
}
579577

580578
public void testNotIndexedFieldPositionIncrement() {

0 commit comments

Comments
 (0)