Skip to content

Commit b704f0e

Browse files
committed
Skip over metadata fields in the field retrieval API. (#58710)
This avoids unnecessary lookups, since metadata fields don't have _source values.
1 parent 680d49c commit b704f0e

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed

server/src/main/java/org/elasticsearch/search/fetch/subphase/FieldValueRetriever.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public static FieldValueRetriever create(MapperService mapperService,
5252

5353
Collection<String> concreteFields = mapperService.simpleMatchToFullName(fieldPattern);
5454
for (String field : concreteFields) {
55-
if (fieldMappers.getMapper(field) != null) {
55+
if (fieldMappers.getMapper(field) != null && mapperService.isMetadataField(field) == false) {
5656
Set<String> sourcePath = mapperService.sourcePath(field);
5757
fields.add(new FieldContext(field, sourcePath, format));
5858
}
@@ -62,6 +62,7 @@ public static FieldValueRetriever create(MapperService mapperService,
6262
return new FieldValueRetriever(fieldMappers, fields);
6363
}
6464

65+
6566
private FieldValueRetriever(DocumentFieldMappers fieldMappers,
6667
List<FieldContext> fieldContexts) {
6768
this.fieldMappers = fieldMappers;

server/src/test/java/org/elasticsearch/search/fetch/subphase/FieldValueRetrieverTests.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,29 @@ public void testNonExistentField() throws IOException {
9393
assertThat(fields.size(), equalTo(0));
9494
}
9595

96+
public void testMetadataFields() throws IOException {
97+
MapperService mapperService = createMapperService();
98+
XContentBuilder source = XContentFactory.jsonBuilder().startObject()
99+
.field("field", "value")
100+
.endObject();
101+
102+
Map<String, DocumentField> fields = retrieveFields(mapperService, source, "_routing");
103+
assertTrue(fields.isEmpty());
104+
}
105+
106+
public void testRetrieveAllFields() throws IOException {
107+
MapperService mapperService = createMapperService();
108+
XContentBuilder source = XContentFactory.jsonBuilder().startObject()
109+
.field("field", "value")
110+
.startObject("object")
111+
.field("field", "other-value")
112+
.endObject()
113+
.endObject();
114+
115+
Map<String, DocumentField> fields = retrieveFields(mapperService, source, "*");
116+
assertThat(fields.size(), equalTo(2));
117+
}
118+
96119
public void testArrayValueMappers() throws IOException {
97120
MapperService mapperService = createMapperService();
98121

0 commit comments

Comments
 (0)