|
@@ -236,9 +236,11 @@ public final class TextFieldMapper extends FieldMapper {
|
|
|
public static class Builder extends FieldMapper.Builder {
|
|
|
|
|
|
private final IndexVersion indexCreatedVersion;
|
|
|
+ private final Parameter<Boolean> store;
|
|
|
+
|
|
|
+ private final boolean isSyntheticSourceEnabledViaIndexMode;
|
|
|
|
|
|
private final Parameter<Boolean> index = Parameter.indexParam(m -> ((TextFieldMapper) m).index, true);
|
|
|
- private final Parameter<Boolean> store = Parameter.storeParam(m -> ((TextFieldMapper) m).store, false);
|
|
|
|
|
|
final Parameter<SimilarityProvider> similarity = TextParams.similarity(m -> ((TextFieldMapper) m).similarity);
|
|
|
|
|
@@ -283,12 +285,28 @@ public final class TextFieldMapper extends FieldMapper {
|
|
|
|
|
|
final TextParams.Analyzers analyzers;
|
|
|
|
|
|
- public Builder(String name, IndexAnalyzers indexAnalyzers) {
|
|
|
- this(name, IndexVersion.current(), indexAnalyzers);
|
|
|
+ public Builder(String name, IndexAnalyzers indexAnalyzers, boolean isSyntheticSourceEnabledViaIndexMode) {
|
|
|
+ this(name, IndexVersion.current(), indexAnalyzers, isSyntheticSourceEnabledViaIndexMode);
|
|
|
}
|
|
|
|
|
|
- public Builder(String name, IndexVersion indexCreatedVersion, IndexAnalyzers indexAnalyzers) {
|
|
|
+ public Builder(
|
|
|
+ String name,
|
|
|
+ IndexVersion indexCreatedVersion,
|
|
|
+ IndexAnalyzers indexAnalyzers,
|
|
|
+ boolean isSyntheticSourceEnabledViaIndexMode
|
|
|
+ ) {
|
|
|
super(name);
|
|
|
+
|
|
|
+ // If synthetic source is used we need to either store this field
|
|
|
+ // to recreate the source or use keyword multi-fields for that.
|
|
|
+ // So if there are no suitable multi-fields we will default to
|
|
|
+ // storing the field without requiring users to explicitly set 'store'.
|
|
|
+ //
|
|
|
+ // If 'store' parameter was explicitly provided we'll reject the request.
|
|
|
+ this.store = Parameter.storeParam(
|
|
|
+ m -> ((TextFieldMapper) m).store,
|
|
|
+ () -> isSyntheticSourceEnabledViaIndexMode && multiFieldsBuilder.hasSyntheticSourceCompatibleKeywordField() == false
|
|
|
+ );
|
|
|
this.indexCreatedVersion = indexCreatedVersion;
|
|
|
this.analyzers = new TextParams.Analyzers(
|
|
|
indexAnalyzers,
|
|
@@ -296,6 +314,7 @@ public final class TextFieldMapper extends FieldMapper {
|
|
|
m -> (((TextFieldMapper) m).positionIncrementGap),
|
|
|
indexCreatedVersion
|
|
|
);
|
|
|
+ this.isSyntheticSourceEnabledViaIndexMode = isSyntheticSourceEnabledViaIndexMode;
|
|
|
}
|
|
|
|
|
|
public Builder index(boolean index) {
|
|
@@ -387,13 +406,9 @@ public final class TextFieldMapper extends FieldMapper {
|
|
|
if (fieldType.stored()) {
|
|
|
return null;
|
|
|
}
|
|
|
- for (Mapper sub : multiFields) {
|
|
|
- if (sub.typeName().equals(KeywordFieldMapper.CONTENT_TYPE)) {
|
|
|
- KeywordFieldMapper kwd = (KeywordFieldMapper) sub;
|
|
|
- if (kwd.hasNormalizer() == false && (kwd.fieldType().hasDocValues() || kwd.fieldType().isStored())) {
|
|
|
- return kwd.fieldType();
|
|
|
- }
|
|
|
- }
|
|
|
+ var kwd = getKeywordFieldMapperForSyntheticSource(multiFields);
|
|
|
+ if (kwd != null) {
|
|
|
+ return kwd.fieldType();
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
@@ -483,7 +498,7 @@ public final class TextFieldMapper extends FieldMapper {
|
|
|
private static final IndexVersion MINIMUM_COMPATIBILITY_VERSION = IndexVersion.fromId(5000099);
|
|
|
|
|
|
public static final TypeParser PARSER = new TypeParser(
|
|
|
- (n, c) -> new Builder(n, c.indexVersionCreated(), c.getIndexAnalyzers()),
|
|
|
+ (n, c) -> new Builder(n, c.indexVersionCreated(), c.getIndexAnalyzers(), c.getIndexSettings().getMode().isSyntheticSourceEnabled()),
|
|
|
MINIMUM_COMPATIBILITY_VERSION
|
|
|
);
|
|
|
|
|
@@ -1203,6 +1218,8 @@ public final class TextFieldMapper extends FieldMapper {
|
|
|
private final SubFieldInfo prefixFieldInfo;
|
|
|
private final SubFieldInfo phraseFieldInfo;
|
|
|
|
|
|
+ private final boolean isSyntheticSourceEnabledViaIndexMode;
|
|
|
+
|
|
|
private TextFieldMapper(
|
|
|
String simpleName,
|
|
|
FieldType fieldType,
|
|
@@ -1235,6 +1252,7 @@ public final class TextFieldMapper extends FieldMapper {
|
|
|
this.indexPrefixes = builder.indexPrefixes.getValue();
|
|
|
this.freqFilter = builder.freqFilter.getValue();
|
|
|
this.fieldData = builder.fieldData.get();
|
|
|
+ this.isSyntheticSourceEnabledViaIndexMode = builder.isSyntheticSourceEnabledViaIndexMode;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -1258,7 +1276,7 @@ public final class TextFieldMapper extends FieldMapper {
|
|
|
|
|
|
@Override
|
|
|
public FieldMapper.Builder getMergeBuilder() {
|
|
|
- return new Builder(simpleName(), indexCreatedVersion, indexAnalyzers).init(this);
|
|
|
+ return new Builder(simpleName(), indexCreatedVersion, indexAnalyzers, isSyntheticSourceEnabledViaIndexMode).init(this);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -1454,15 +1472,12 @@ public final class TextFieldMapper extends FieldMapper {
|
|
|
}
|
|
|
};
|
|
|
}
|
|
|
- for (Mapper sub : this) {
|
|
|
- if (sub.typeName().equals(KeywordFieldMapper.CONTENT_TYPE)) {
|
|
|
- KeywordFieldMapper kwd = (KeywordFieldMapper) sub;
|
|
|
- if (kwd.hasNormalizer() == false && (kwd.fieldType().hasDocValues() || kwd.fieldType().isStored())) {
|
|
|
|
|
|
- return kwd.syntheticFieldLoader(simpleName());
|
|
|
- }
|
|
|
- }
|
|
|
+ var kwd = getKeywordFieldMapperForSyntheticSource(this);
|
|
|
+ if (kwd != null) {
|
|
|
+ return kwd.syntheticFieldLoader(simpleName());
|
|
|
}
|
|
|
+
|
|
|
throw new IllegalArgumentException(
|
|
|
String.format(
|
|
|
Locale.ROOT,
|
|
@@ -1473,4 +1488,17 @@ public final class TextFieldMapper extends FieldMapper {
|
|
|
)
|
|
|
);
|
|
|
}
|
|
|
+
|
|
|
+ private static KeywordFieldMapper getKeywordFieldMapperForSyntheticSource(Iterable<? extends Mapper> multiFields) {
|
|
|
+ for (Mapper sub : multiFields) {
|
|
|
+ if (sub.typeName().equals(KeywordFieldMapper.CONTENT_TYPE)) {
|
|
|
+ KeywordFieldMapper kwd = (KeywordFieldMapper) sub;
|
|
|
+ if (kwd.hasNormalizer() == false && (kwd.fieldType().hasDocValues() || kwd.fieldType().isStored())) {
|
|
|
+ return kwd;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return null;
|
|
|
+ }
|
|
|
}
|