Skip to content

Commit 134dab6

Browse files
authored
Don't rebuild shadowed field lookup on every document (#76023)
#75595 added better checks for fields shadowed by runtime fields, so that we don't index data that would never be searched. However, the shadow lookup was being rebuilt for every document, which has caused a noticeable regression in indexing times. This commit reworks things so that this lookup is built once per mapping update and lives on MappingLookup.
1 parent 453877d commit 134dab6

File tree

2 files changed

+17
-14
lines changed

2 files changed

+17
-14
lines changed

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

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,6 @@ protected void addDoc(LuceneDocument doc) {
9292
private final Set<String> newFieldsSeen;
9393
private final Map<String, ObjectMapper> dynamicObjectMappers;
9494
private final List<RuntimeField> dynamicRuntimeFields;
95-
private final Set<String> shadowedFields;
9695
private Field version;
9796
private SeqNoFieldMapper.SequenceIDFields seqID;
9897

@@ -108,7 +107,6 @@ private DocumentParserContext(DocumentParserContext in) {
108107
this.newFieldsSeen = in.newFieldsSeen;
109108
this.dynamicObjectMappers = in.dynamicObjectMappers;
110109
this.dynamicRuntimeFields = in.dynamicRuntimeFields;
111-
this.shadowedFields = in.shadowedFields;
112110
this.version = in.version;
113111
this.seqID = in.seqID;
114112
}
@@ -129,17 +127,6 @@ protected DocumentParserContext(MappingLookup mappingLookup,
129127
this.newFieldsSeen = new HashSet<>();
130128
this.dynamicObjectMappers = new HashMap<>();
131129
this.dynamicRuntimeFields = new ArrayList<>();
132-
this.shadowedFields = buildShadowedFields(mappingLookup);
133-
}
134-
135-
private static Set<String> buildShadowedFields(MappingLookup lookup) {
136-
Set<String> shadowedFields = new HashSet<>();
137-
for (RuntimeField runtimeField : lookup.getMapping().getRoot().runtimeFields()) {
138-
for (MappedFieldType mft : runtimeField.asMappedFieldTypes()) {
139-
shadowedFields.add(mft.name());
140-
}
141-
}
142-
return shadowedFields;
143130
}
144131

145132
public final IndexSettings indexSettings() {
@@ -243,7 +230,7 @@ public final List<Mapper> getDynamicMappers() {
243230
}
244231

245232
public final boolean isShadowed(String field) {
246-
return shadowedFields.contains(field);
233+
return mappingLookup.isShadowed(field);
247234
}
248235

249236
public final ObjectMapper getObjectMapper(String name) {

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import java.util.Collection;
1717
import java.util.Collections;
1818
import java.util.HashMap;
19+
import java.util.HashSet;
1920
import java.util.List;
2021
import java.util.Map;
2122
import java.util.Set;
@@ -51,6 +52,7 @@ private CacheKey() {}
5152
private final Map<String, NamedAnalyzer> indexAnalyzersMap = new HashMap<>();
5253
private final List<FieldMapper> indexTimeScriptMappers = new ArrayList<>();
5354
private final Mapping mapping;
55+
private final Set<String> shadowedFields;
5456

5557
/**
5658
* Creates a new {@link MappingLookup} instance by parsing the provided mapping and extracting its field definitions.
@@ -157,6 +159,13 @@ private MappingLookup(Mapping mapping,
157159
}
158160
}
159161

162+
this.shadowedFields = new HashSet<>();
163+
for (RuntimeField runtimeField : mapping.getRoot().runtimeFields()) {
164+
for (MappedFieldType mft : runtimeField.asMappedFieldTypes()) {
165+
shadowedFields.add(mft.name());
166+
}
167+
}
168+
160169
this.fieldTypeLookup = new FieldTypeLookup(mappers, aliasMappers, mapping.getRoot().runtimeFields());
161170
this.indexTimeLookup = new FieldTypeLookup(mappers, aliasMappers, Collections.emptyList());
162171
this.fieldMappers = Collections.unmodifiableMap(fieldMappers);
@@ -199,6 +208,13 @@ public Iterable<Mapper> fieldMappers() {
199208
return fieldMappers.values();
200209
}
201210

211+
/**
212+
* @return {@code true} if the given field is shadowed by a runtime field
213+
*/
214+
public boolean isShadowed(String field) {
215+
return shadowedFields.contains(field);
216+
}
217+
202218
void checkLimits(IndexSettings settings) {
203219
checkFieldLimit(settings.getMappingTotalFieldsLimit());
204220
checkObjectDepthLimit(settings.getMappingDepthLimit());

0 commit comments

Comments
 (0)