Skip to content

Commit 39e7be1

Browse files
committed
Fixed text field mapper index mode and match only text missing synthetic source delegate
1 parent af58d38 commit 39e7be1

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
@@ -732,6 +732,20 @@ public TextFieldType(String name, boolean isSyntheticSource) {
732732
);
733733
}
734734

735+
public TextFieldType(String name, boolean isSyntheticSource, KeywordFieldMapper.KeywordFieldType syntheticSourceDelegate) {
736+
this(
737+
name,
738+
true,
739+
false,
740+
new TextSearchInfo(Defaults.FIELD_TYPE, null, Lucene.STANDARD_ANALYZER, Lucene.STANDARD_ANALYZER),
741+
isSyntheticSource,
742+
syntheticSourceDelegate,
743+
Collections.emptyMap(),
744+
false,
745+
false
746+
);
747+
}
748+
735749
public boolean fielddata() {
736750
return fielddata;
737751
}
@@ -1361,7 +1375,8 @@ private TextFieldMapper(
13611375
assert mappedFieldType.getTextSearchInfo().isTokenized();
13621376
assert mappedFieldType.hasDocValues() == false;
13631377

1364-
if (fieldType.indexOptions() == IndexOptions.NONE && fieldType().fielddata()) {
1378+
final boolean isIndexed = fieldType.indexOptions() != IndexOptions.NONE;
1379+
if (isIndexed == false && fieldType().fielddata()) {
13651380
throw new IllegalArgumentException("Cannot enable fielddata on a [text] field that is not indexed: [" + fullPath() + "]");
13661381
}
13671382

@@ -1415,7 +1430,7 @@ protected void parseCreateField(DocumentParserContext context) throws IOExceptio
14151430
return;
14161431
}
14171432

1418-
if (fieldType.indexOptions() != IndexOptions.NONE || fieldType.stored()) {
1433+
if (isIndexed() || fieldType.stored()) {
14191434
Field field = new Field(fieldType().name(), value.string(), fieldType);
14201435
context.doc().add(field);
14211436
if (fieldType.omitNorms()) {
@@ -1602,6 +1617,10 @@ protected void doXContentBody(XContentBuilder builder, Params params) throws IOE
16021617
b.indexPhrases.toXContent(builder, includeDefaults);
16031618
}
16041619

1620+
private boolean isIndexed() {
1621+
return fieldType.indexOptions() != IndexOptions.NONE;
1622+
}
1623+
16051624
@Override
16061625
protected SyntheticSourceSupport syntheticSourceSupport() {
16071626
if (store) {
@@ -1613,7 +1632,7 @@ protected void write(XContentBuilder b, Object value) throws IOException {
16131632
});
16141633
}
16151634

1616-
if (fieldType.indexOptions() != IndexOptions.NONE) {
1635+
if (isIndexed()) {
16171636
return super.syntheticSourceSupport();
16181637
}
16191638

0 commit comments

Comments
 (0)