Skip to content

Commit 48a38c5

Browse files
committed
Fixed text field mapper index mode and match only text missing synthetic source delegate
1 parent 2068ffe commit 48a38c5

File tree

3 files changed

+53
-19
lines changed

3 files changed

+53
-19
lines changed

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

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -135,29 +135,39 @@ protected Parameter<?>[] getParameters() {
135135
return new Parameter<?>[] { meta };
136136
}
137137

138-
private MatchOnlyTextFieldType buildFieldType(MapperBuilderContext context) {
138+
private MatchOnlyTextFieldType buildFieldType(MapperBuilderContext context, MultiFields multiFields) {
139139
NamedAnalyzer searchAnalyzer = analyzers.getSearchAnalyzer();
140140
NamedAnalyzer searchQuoteAnalyzer = analyzers.getSearchQuoteAnalyzer();
141141
NamedAnalyzer indexAnalyzer = analyzers.getIndexAnalyzer();
142142
TextSearchInfo tsi = new TextSearchInfo(Defaults.FIELD_TYPE, null, searchAnalyzer, searchQuoteAnalyzer);
143-
MatchOnlyTextFieldType ft = new MatchOnlyTextFieldType(
144-
context.buildFullName(leafName()),
145-
tsi,
146-
indexAnalyzer,
147-
context.isSourceSynthetic(),
148-
meta.getValue(),
149-
isWithinMultiField,
150-
storedFieldInBinaryFormat
151-
);
152-
return ft;
143+
return new MatchOnlyTextFieldType(
144+
context.buildFullName(leafName()),
145+
tsi,
146+
indexAnalyzer,
147+
context.isSourceSynthetic(),
148+
meta.getValue(),
149+
isWithinMultiField,
150+
storedFieldInBinaryFormat,
151+
TextFieldMapper.SyntheticSourceHelper.syntheticSourceDelegate(getFieldType(), multiFields));
152+
}
153+
154+
/**
155+
* This is more of a helper function that's useful in TextFieldMapper.SyntheticSourceHelper.syntheticSourceDelegate()
156+
*/
157+
private FieldType getFieldType() {
158+
FieldType fieldType = new FieldType();
159+
// by definition, match_only_text are not stored
160+
fieldType.setStored(false);
161+
return fieldType;
153162
}
154163

155164
@Override
156165
public MatchOnlyTextFieldMapper build(MapperBuilderContext context) {
157166
this.isSyntheticSourceEnabled = context.isSourceSynthetic();
158167

159-
MatchOnlyTextFieldType tft = buildFieldType(context);
160-
return new MatchOnlyTextFieldMapper(leafName(), Defaults.FIELD_TYPE, tft, builderParams(this, context), this);
168+
BuilderParams builderParams = builderParams(this, context);
169+
MatchOnlyTextFieldType tft = buildFieldType(context, builderParams.multiFields());
170+
return new MatchOnlyTextFieldMapper(leafName(), Defaults.FIELD_TYPE, tft, builderParams, this);
161171
}
162172
}
163173

@@ -194,11 +204,13 @@ public MatchOnlyTextFieldType(
194204
boolean isSyntheticSource,
195205
Map<String, String> meta,
196206
boolean withinMultiField,
197-
boolean storedFieldInBinaryFormat
207+
boolean storedFieldInBinaryFormat,
208+
KeywordFieldMapper.KeywordFieldType syntheticSourceDelegate
198209
) {
199210
super(name, true, false, false, tsi, meta);
200211
this.indexAnalyzer = Objects.requireNonNull(indexAnalyzer);
201-
this.textFieldType = new TextFieldType(name, isSyntheticSource);
212+
// TODO: need to set synthetic source delegate correctly
213+
this.textFieldType = new TextFieldType(name, isSyntheticSource, syntheticSourceDelegate);
202214
this.withinMultiField = withinMultiField;
203215
this.storedFieldInBinaryFormat = storedFieldInBinaryFormat;
204216
}
@@ -211,7 +223,8 @@ public MatchOnlyTextFieldType(String name) {
211223
false,
212224
Collections.emptyMap(),
213225
false,
214-
false
226+
false,
227+
null
215228
);
216229
}
217230

modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/extras/MatchOnlyTextFieldMapperTests.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,8 @@ public void testStoreParameterDefaultsSyntheticSourceWithKeywordMultiField() thr
327327
}
328328
}
329329

330+
// TODO: add tests when string length is exceeding, same for TextFieldMapper
331+
330332
public void testStoreParameterDefaultsSyntheticSourceTextFieldIsMultiField() throws IOException {
331333
var indexSettingsBuilder = getIndexSettingsBuilder();
332334
indexSettingsBuilder.put(IndexSettings.INDEX_MAPPER_SOURCE_MODE_SETTING.getKey(), "synthetic");

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

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -710,6 +710,20 @@ public TextFieldType(String name, boolean isSyntheticSource) {
710710
);
711711
}
712712

713+
public TextFieldType(String name, boolean isSyntheticSource, KeywordFieldMapper.KeywordFieldType syntheticSourceDelegate) {
714+
this(
715+
name,
716+
true,
717+
false,
718+
new TextSearchInfo(Defaults.FIELD_TYPE, null, Lucene.STANDARD_ANALYZER, Lucene.STANDARD_ANALYZER),
719+
isSyntheticSource,
720+
syntheticSourceDelegate,
721+
Collections.emptyMap(),
722+
false,
723+
false
724+
);
725+
}
726+
713727
public boolean fielddata() {
714728
return fielddata;
715729
}
@@ -1333,7 +1347,8 @@ private TextFieldMapper(
13331347
assert mappedFieldType.getTextSearchInfo().isTokenized();
13341348
assert mappedFieldType.hasDocValues() == false;
13351349

1336-
if (fieldType.indexOptions() == IndexOptions.NONE && fieldType().fielddata()) {
1350+
final boolean isIndexed = fieldType.indexOptions() != IndexOptions.NONE;
1351+
if (isIndexed == false && fieldType().fielddata()) {
13371352
throw new IllegalArgumentException("Cannot enable fielddata on a [text] field that is not indexed: [" + fullPath() + "]");
13381353
}
13391354

@@ -1386,7 +1401,7 @@ protected void parseCreateField(DocumentParserContext context) throws IOExceptio
13861401
return;
13871402
}
13881403

1389-
if (fieldType.indexOptions() != IndexOptions.NONE || fieldType.stored()) {
1404+
if (isIndexed() || fieldType.stored()) {
13901405
Field field = new Field(fieldType().name(), value.string(), fieldType);
13911406
context.doc().add(field);
13921407
if (fieldType.omitNorms()) {
@@ -1573,6 +1588,10 @@ protected void doXContentBody(XContentBuilder builder, Params params) throws IOE
15731588
b.indexPhrases.toXContent(builder, includeDefaults);
15741589
}
15751590

1591+
private boolean isIndexed() {
1592+
return fieldType.indexOptions() != IndexOptions.NONE;
1593+
}
1594+
15761595
@Override
15771596
protected SyntheticSourceSupport syntheticSourceSupport() {
15781597
if (store) {
@@ -1584,7 +1603,7 @@ protected void write(XContentBuilder b, Object value) throws IOException {
15841603
});
15851604
}
15861605

1587-
if (fieldType.indexOptions() != IndexOptions.NONE) {
1606+
if (isIndexed()) {
15881607
return super.syntheticSourceSupport();
15891608
}
15901609

0 commit comments

Comments
 (0)