Skip to content

Commit 5b6bb47

Browse files
authored
Pass down source only runtime field's name as source filter when source mode is synthetic (elastic#133897)
If runtime fields have no scripts, then use the runtime field name as source filter. This avoids synthesizing fields that are not requested
1 parent bfde47a commit 5b6bb47

27 files changed

+373
-22
lines changed

docs/changelog/133897.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
pr: 133897
2+
summary: "Runtime fields: pass down runtime field name as source filter when source\
3+
\ mode is synthetic"
4+
area: "Mapping"
5+
type: enhancement
6+
issues: []

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.elasticsearch.script.ScriptContext;
2828
import org.elasticsearch.search.fetch.StoredFieldsSpec;
2929
import org.elasticsearch.search.lookup.SearchLookup;
30+
import org.elasticsearch.search.lookup.SourceFilter;
3031
import org.elasticsearch.xcontent.XContentBuilder;
3132

3233
import java.time.ZoneId;
@@ -48,18 +49,21 @@ public abstract class AbstractScriptFieldType<LeafFactory> extends MappedFieldTy
4849
protected final Script script;
4950
private final Function<SearchLookup, LeafFactory> factory;
5051
private final boolean isResultDeterministic;
52+
private final boolean isParsedFromSource;
5153

5254
protected AbstractScriptFieldType(
5355
String name,
5456
Function<SearchLookup, LeafFactory> factory,
5557
Script script,
5658
boolean isResultDeterministic,
57-
Map<String, String> meta
59+
Map<String, String> meta,
60+
boolean isParsedFromSource
5861
) {
5962
super(name, false, false, false, TextSearchInfo.SIMPLE_MATCH_WITHOUT_TERMS, meta);
6063
this.factory = factory;
6164
this.script = Objects.requireNonNull(script);
6265
this.isResultDeterministic = isResultDeterministic;
66+
this.isParsedFromSource = isParsedFromSource;
6367
}
6468

6569
@Override
@@ -190,7 +194,13 @@ public ValueFetcher valueFetcher(SearchExecutionContext context, String format)
190194
* Create a script leaf factory.
191195
*/
192196
protected final LeafFactory leafFactory(SearchLookup searchLookup) {
193-
return factory.apply(searchLookup);
197+
if (isParsedFromSource) {
198+
String include = name();
199+
var copy = searchLookup.optimizedSourceProvider(new SourceFilter(new String[] { include }, new String[0]));
200+
return factory.apply(copy);
201+
} else {
202+
return factory.apply(searchLookup);
203+
}
194204
}
195205

196206
/**

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,8 @@ public static RuntimeField sourceOnly(String name) {
8383
searchLookup -> scriptFactory.newFactory(name, script.getParams(), searchLookup, onScriptError),
8484
script,
8585
scriptFactory.isResultDeterministic(),
86-
meta
86+
meta,
87+
scriptFactory.isParsedFromSource()
8788
);
8889
}
8990

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,8 @@ public static RuntimeField sourceOnly(String name, DateFormatter dateTimeFormatt
148148
searchLookup -> scriptFactory.newFactory(name, script.getParams(), searchLookup, dateTimeFormatter, onScriptError),
149149
script,
150150
scriptFactory.isResultDeterministic(),
151-
meta
151+
meta,
152+
scriptFactory.isParsedFromSource()
152153
);
153154
this.dateTimeFormatter = dateTimeFormatter;
154155
this.dateMathParser = dateTimeFormatter.toDateMathParser();

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,8 @@ public static RuntimeField sourceOnly(String name) {
8383
searchLookup -> scriptFactory.newFactory(name, script.getParams(), searchLookup, onScriptError),
8484
script,
8585
scriptFactory.isResultDeterministic(),
86-
meta
86+
meta,
87+
scriptFactory.isParsedFromSource()
8788
);
8889
}
8990

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,8 @@ protected GeoPointFieldScript.Factory getCompositeLeafFactory(
8383
searchLookup -> scriptFactory.newFactory(name, script.getParams(), searchLookup, onScriptError),
8484
script,
8585
scriptFactory.isResultDeterministic(),
86-
meta
86+
meta,
87+
scriptFactory.isParsedFromSource()
8788
);
8889
}
8990

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,8 @@ protected IpFieldScript.Factory getCompositeLeafFactory(
8181
searchLookup -> scriptFactory.newFactory(name, script.getParams(), searchLookup, onScriptError),
8282
script,
8383
scriptFactory.isResultDeterministic(),
84-
meta
84+
meta,
85+
scriptFactory.isParsedFromSource()
8586
);
8687
}
8788

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,8 @@ public KeywordScriptFieldType(
9292
searchLookup -> scriptFactory.newFactory(name, script.getParams(), searchLookup, onScriptError),
9393
script,
9494
scriptFactory.isResultDeterministic(),
95-
meta
95+
meta,
96+
scriptFactory.isParsedFromSource()
9697
);
9798
}
9899

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,8 @@ public LongScriptFieldType(
8383
searchLookup -> scriptFactory.newFactory(name, script.getParams(), searchLookup, onScriptError),
8484
script,
8585
scriptFactory.isResultDeterministic(),
86-
meta
86+
meta,
87+
scriptFactory.isParsedFromSource()
8788
);
8889
}
8990

server/src/main/java/org/elasticsearch/index/query/SearchExecutionContext.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -503,14 +503,14 @@ public boolean containsBrokenAnalysis(String field) {
503503
*/
504504
public SearchLookup lookup() {
505505
if (this.lookup == null) {
506-
var sourceProvider = createSourceProvider();
506+
var sourceProvider = createSourceProvider(null);
507507
setLookupProviders(sourceProvider, LeafFieldLookupProvider.fromStoredFields());
508508
}
509509
return this.lookup;
510510
}
511511

512-
public SourceProvider createSourceProvider() {
513-
return SourceProvider.fromLookup(mappingLookup, null, mapperMetrics.sourceFieldMetrics());
512+
public SourceProvider createSourceProvider(SourceFilter sourceFilter) {
513+
return SourceProvider.fromLookup(mappingLookup, sourceFilter, mapperMetrics.sourceFieldMetrics());
514514
}
515515

516516
/**

0 commit comments

Comments
 (0)