Skip to content

Commit 86d5746

Browse files
committed
iter
1 parent dfb60c6 commit 86d5746

File tree

18 files changed

+143
-122
lines changed

18 files changed

+143
-122
lines changed

server/src/main/java/org/elasticsearch/action/search/RankFeaturePhase.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ private SearchPhaseController.ReducedQueryPhase newReducedQueryPhaseResults(
252252
reducedQueryPhase.size(),
253253
reducedQueryPhase.from(),
254254
reducedQueryPhase.isEmptyResult(),
255-
reducedQueryPhase.rangeTimestampFromMillis()
255+
reducedQueryPhase.timeRangeFilterFromMillis()
256256
);
257257
}
258258

server/src/main/java/org/elasticsearch/action/search/SearchPhaseController.java

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -517,7 +517,7 @@ static ReducedQueryPhase reducedQueryPhase(
517517
: Collections.emptyMap();
518518
int from = 0;
519519
int size = 0;
520-
Long rangeTimestampFromMillis = null;
520+
Long timeRangeFilterFromMillis = null;
521521
DocValueFormat[] sortValueFormats = null;
522522
for (QuerySearchResult result : nonNullResults) {
523523
from = result.from();
@@ -527,14 +527,15 @@ static ReducedQueryPhase reducedQueryPhase(
527527
sortValueFormats = result.sortValueFormats();
528528
}
529529

530-
if (rangeTimestampFromMillis == null) {
530+
if (timeRangeFilterFromMillis == null) {
531531
// we simply take the first one: we should get the same value from all shards anyway
532-
rangeTimestampFromMillis = result.getRangeTimestampFromMillis();
532+
timeRangeFilterFromMillis = result.getTimeRangeFilterFromMillis();
533533
}
534-
assert rangeTimestampFromMillis == null
535-
|| result.getRangeTimestampFromMillis() == null
536-
|| rangeTimestampFromMillis.equals(result.getRangeTimestampFromMillis())
537-
: rangeTimestampFromMillis + " != " + result.getRangeTimestampFromMillis();
534+
535+
assert timeRangeFilterFromMillis == null
536+
|| result.getTimeRangeFilterFromMillis() == null
537+
|| timeRangeFilterFromMillis.equals(result.getTimeRangeFilterFromMillis())
538+
: timeRangeFilterFromMillis + " != " + result.getTimeRangeFilterFromMillis();
538539

539540
if (hasSuggest) {
540541
assert result.suggest() != null;
@@ -591,7 +592,7 @@ static ReducedQueryPhase reducedQueryPhase(
591592
size,
592593
from,
593594
false,
594-
rangeTimestampFromMillis
595+
timeRangeFilterFromMillis
595596
);
596597
}
597598

@@ -675,7 +676,7 @@ public record ReducedQueryPhase(
675676
int from,
676677
// <code>true</code> iff the query phase had no results. Otherwise <code>false</code>
677678
boolean isEmptyResult,
678-
Long rangeTimestampFromMillis
679+
Long timeRangeFilterFromMillis
679680
) {
680681

681682
public ReducedQueryPhase {
@@ -697,7 +698,7 @@ public SearchResponseSections buildResponse(SearchHits hits, Collection<? extend
697698
terminatedEarly,
698699
buildSearchProfileResults(fetchResults),
699700
numReducePhases,
700-
rangeTimestampFromMillis
701+
timeRangeFilterFromMillis
701702
);
702703
}
703704

server/src/main/java/org/elasticsearch/action/search/SearchRequestAttributesExtractor.java

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111

1212
import org.apache.logging.log4j.LogManager;
1313
import org.apache.logging.log4j.Logger;
14+
import org.elasticsearch.cluster.metadata.DataStream;
15+
import org.elasticsearch.cluster.metadata.IndexMetadata;
1416
import org.elasticsearch.common.regex.Regex;
1517
import org.elasticsearch.common.util.concurrent.EsExecutors;
1618
import org.elasticsearch.core.TimeValue;
@@ -55,13 +57,13 @@ public static Map<String, Object> extractAttributes(SearchRequest searchRequest,
5557
*/
5658
public static Map<String, Object> extractAttributes(
5759
ShardSearchRequest shardSearchRequest,
58-
Long rangeTimestampFromMillis,
60+
Long timeRangeFilterFromMillis,
5961
long nowInMillis
6062
) {
6163
Map<String, Object> attributes = extractAttributes(
6264
shardSearchRequest.source(),
6365
shardSearchRequest.scroll(),
64-
rangeTimestampFromMillis,
66+
timeRangeFilterFromMillis,
6567
nowInMillis,
6668
shardSearchRequest.shardId().getIndexName()
6769
);
@@ -73,7 +75,7 @@ public static Map<String, Object> extractAttributes(
7375
private static Map<String, Object> extractAttributes(
7476
SearchSourceBuilder searchSourceBuilder,
7577
TimeValue scroll,
76-
Long rangeTimestampFromMillis,
78+
Long timeRangeFilterFromMillis,
7779
long nowInMillis,
7880
String... localIndices
7981
) {
@@ -111,9 +113,9 @@ private static Map<String, Object> extractAttributes(
111113
}
112114

113115
final boolean hasKnn = searchSourceBuilder.knnSearch().isEmpty() == false || queryMetadataBuilder.knnQuery;
114-
String timestampRangeFilter = null;
115-
if (rangeTimestampFromMillis != null) {
116-
timestampRangeFilter = introspectTimeRange(rangeTimestampFromMillis, nowInMillis);
116+
String timeRangeFilterFrom = null;
117+
if (timeRangeFilterFromMillis != null) {
118+
timeRangeFilterFrom = introspectTimeRange(timeRangeFilterFromMillis, nowInMillis);
117119
}
118120
return buildAttributesMap(
119121
target,
@@ -123,7 +125,7 @@ private static Map<String, Object> extractAttributes(
123125
queryMetadataBuilder.rangeOnTimestamp,
124126
queryMetadataBuilder.rangeOnEventIngested,
125127
pitOrScroll,
126-
timestampRangeFilter
128+
timeRangeFilterFrom
127129
);
128130
}
129131

@@ -135,7 +137,7 @@ private static Map<String, Object> buildAttributesMap(
135137
boolean rangeOnTimestamp,
136138
boolean rangeOnEventIngested,
137139
String pitOrScroll,
138-
String timestampRangeFilter
140+
String timeRangeFilterFrom
139141
) {
140142
Map<String, Object> attributes = new HashMap<>(5, 1.0f);
141143
attributes.put(TARGET_ATTRIBUTE, target);
@@ -147,14 +149,18 @@ private static Map<String, Object> buildAttributesMap(
147149
if (knn) {
148150
attributes.put(KNN_ATTRIBUTE, knn);
149151
}
150-
if (rangeOnTimestamp) {
151-
attributes.put(RANGE_TIMESTAMP_ATTRIBUTE, rangeOnTimestamp);
152+
if (rangeOnTimestamp && rangeOnEventIngested) {
153+
attributes.put(
154+
TIME_RANGE_FILTER_FIELD_ATTRIBUTE,
155+
DataStream.TIMESTAMP_FIELD_NAME + "_AND_" + IndexMetadata.EVENT_INGESTED_FIELD_NAME
156+
);
157+
} else if (rangeOnEventIngested) {
158+
attributes.put(TIME_RANGE_FILTER_FIELD_ATTRIBUTE, IndexMetadata.EVENT_INGESTED_FIELD_NAME);
159+
} else if (rangeOnTimestamp) {
160+
attributes.put(TIME_RANGE_FILTER_FIELD_ATTRIBUTE, DataStream.TIMESTAMP_FIELD_NAME);
152161
}
153-
if (rangeOnEventIngested) {
154-
attributes.put(RANGE_EVENT_INGESTED_ATTRIBUTE, rangeOnEventIngested);
155-
}
156-
if (timestampRangeFilter != null) {
157-
attributes.put(TIMESTAMP_RANGE_FILTER_ATTRIBUTE, timestampRangeFilter);
162+
if (timeRangeFilterFrom != null) {
163+
attributes.put(TIME_RANGE_FILTER_FROM_ATTRIBUTE, timeRangeFilterFrom);
158164
}
159165
return attributes;
160166
}
@@ -170,9 +176,8 @@ private static final class QueryMetadataBuilder {
170176
static final String QUERY_TYPE_ATTRIBUTE = "query_type";
171177
static final String PIT_SCROLL_ATTRIBUTE = "pit_scroll";
172178
static final String KNN_ATTRIBUTE = "knn";
173-
static final String RANGE_TIMESTAMP_ATTRIBUTE = "range_timestamp";
174-
static final String RANGE_EVENT_INGESTED_ATTRIBUTE = "range_event_ingested";
175-
static final String TIMESTAMP_RANGE_FILTER_ATTRIBUTE = "timestamp_range_filter";
179+
static final String TIME_RANGE_FILTER_FIELD_ATTRIBUTE = "time_range_filter_field";
180+
static final String TIME_RANGE_FILTER_FROM_ATTRIBUTE = "time_range_filter_from";
176181

177182
private static final String TARGET_KIBANA = ".kibana";
178183
private static final String TARGET_ML = ".ml";
@@ -307,6 +312,10 @@ private static void introspectQueryBuilder(QueryBuilder queryBuilder, QueryMetad
307312
introspectQueryBuilder(nested.query(), queryMetadataBuilder, ++level);
308313
break;
309314
case RangeQueryBuilder range:
315+
// Note that the outcome of this switch differs depending on whether it is executed on the coord node, or data node.
316+
// Data nodes perform query rewrite on each shard. That means that a query that reports a certain time range filter at the
317+
// coordinator, may not report the same for all the shards it targets, but rather only for those that do end up executing
318+
// a true range query at the shard level.
310319
switch (range.fieldName()) {
311320
// don't track unbounded ranges, they translate to either match_none if the field does not exist
312321
// or match_all if the field is mapped
@@ -350,7 +359,7 @@ private enum TimeRangeBucket {
350359
public static void addTimeRangeAttribute(Long timeRangeFrom, long nowInMillis, Map<String, Object> attributes) {
351360
if (timeRangeFrom != null) {
352361
String timestampRangeFilter = introspectTimeRange(timeRangeFrom, nowInMillis);
353-
attributes.put(TIMESTAMP_RANGE_FILTER_ATTRIBUTE, timestampRangeFilter);
362+
attributes.put(TIME_RANGE_FILTER_FROM_ATTRIBUTE, timestampRangeFilter);
354363
}
355364
}
356365

server/src/main/java/org/elasticsearch/action/search/SearchResponse.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ public class SearchResponse extends ActionResponse implements ChunkedToXContentO
8888
private final Clusters clusters;
8989
private final long tookInMillis;
9090
// only used for telemetry purposes on the coordinating node, where the search response gets created
91-
private transient Long rangeTimestampFromMillis;
91+
private transient Long timeRangeFilterFromMillis;
9292

9393
private final RefCounted refCounted = LeakTracker.wrap(new SimpleRefCounted());
9494

@@ -189,7 +189,7 @@ public SearchResponse(
189189
clusters,
190190
pointInTimeId
191191
);
192-
this.rangeTimestampFromMillis = searchResponseSections.rangeTimestampFromMillis;
192+
this.timeRangeFilterFromMillis = searchResponseSections.timeRangeFilterFromMillis;
193193
}
194194

195195
public SearchResponse(
@@ -467,8 +467,8 @@ public void writeTo(StreamOutput out) throws IOException {
467467
out.writeOptionalBytesReference(pointInTimeId);
468468
}
469469

470-
public Long getRangeTimestampFromMillis() {
471-
return rangeTimestampFromMillis;
470+
public Long getTimeRangeFilterFromMillis() {
471+
return timeRangeFilterFromMillis;
472472
}
473473

474474
@Override

server/src/main/java/org/elasticsearch/action/search/SearchResponseSections.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public class SearchResponseSections implements Releasable {
5252
protected final boolean timedOut;
5353
protected final Boolean terminatedEarly;
5454
protected final int numReducePhases;
55-
protected final Long rangeTimestampFromMillis;
55+
protected final Long timeRangeFilterFromMillis;
5656

5757
public SearchResponseSections(
5858
SearchHits hits,
@@ -62,7 +62,7 @@ public SearchResponseSections(
6262
Boolean terminatedEarly,
6363
SearchProfileResults profileResults,
6464
int numReducePhases,
65-
Long rangeTimestampFromMillis
65+
Long timeRangeFilterFromMillis
6666
) {
6767
this.hits = hits;
6868
this.aggregations = aggregations;
@@ -71,7 +71,7 @@ public SearchResponseSections(
7171
this.timedOut = timedOut;
7272
this.terminatedEarly = terminatedEarly;
7373
this.numReducePhases = numReducePhases;
74-
this.rangeTimestampFromMillis = rangeTimestampFromMillis;
74+
this.timeRangeFilterFromMillis = timeRangeFilterFromMillis;
7575
}
7676

7777
public final SearchHits hits() {

server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2094,7 +2094,7 @@ public void onResponse(SearchResponse searchResponse) {
20942094
try {
20952095
searchResponseMetrics.recordTookTime(
20962096
searchResponse.getTookInMillis(),
2097-
searchResponse.getRangeTimestampFromMillis(),
2097+
searchResponse.getTimeRangeFilterFromMillis(),
20982098
nowInMillis,
20992099
searchRequestAttributes
21002100
);

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

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import org.apache.lucene.search.IndexSortSortedNumericDocValuesRangeQuery;
2626
import org.apache.lucene.search.Query;
2727
import org.elasticsearch.ElasticsearchParseException;
28-
import org.elasticsearch.cluster.metadata.DataStream;
2928
import org.elasticsearch.common.geo.ShapeRelation;
3029
import org.elasticsearch.common.logging.DeprecationCategory;
3130
import org.elasticsearch.common.logging.DeprecationLogger;
@@ -804,9 +803,7 @@ public static Query dateRangeQuery(
804803
if (includeLower == false) {
805804
++l;
806805
}
807-
if (fieldName.equals(DataStream.TIMESTAMP_FIELD_NAME)) {
808-
context.setRangeTimestampFromMillis(l);
809-
}
806+
context.setTimeRangeFilterFromMillis(fieldName, l, resolution);
810807
}
811808
if (upperTerm == null) {
812809
u = Long.MAX_VALUE;
@@ -996,9 +993,9 @@ public Relation isFieldWithinQuery(
996993
}
997994
++fromInclusive;
998995
}
999-
if (fieldName.equals(DataStream.TIMESTAMP_FIELD_NAME)) {
1000-
context.setRangeTimestampFromMillis(fromInclusive);
1001-
}
996+
// we set the time range filter from during rewrite, because this may be the only time we ever parse it,
997+
// in case the shard if filtered out and does not run the query phase or all its docs are within the bounds.
998+
context.setTimeRangeFilterFromMillis(fieldName, fromInclusive, resolution);
1002999
}
10031000

10041001
long toInclusive = Long.MAX_VALUE;

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -302,11 +302,11 @@ protected Query doToQuery(SearchExecutionContext context) throws IOException {
302302
addBooleanClauses(context, booleanQueryBuilder, mustClauses, BooleanClause.Occur.MUST);
303303
try {
304304
// disable tracking of the @timestamp range for must_not and should clauses
305-
context.setTrackRangeTimestampFromMillis(false);
305+
context.setTrackTimeRangeFilterFrom(false);
306306
addBooleanClauses(context, booleanQueryBuilder, mustNotClauses, BooleanClause.Occur.MUST_NOT);
307307
addBooleanClauses(context, booleanQueryBuilder, shouldClauses, BooleanClause.Occur.SHOULD);
308308
} finally {
309-
context.setTrackRangeTimestampFromMillis(true);
309+
context.setTrackTimeRangeFilterFrom(true);
310310
}
311311
addBooleanClauses(context, booleanQueryBuilder, filterClauses, BooleanClause.Occur.FILTER);
312312
BooleanQuery booleanQuery = booleanQueryBuilder.build();
@@ -357,18 +357,18 @@ protected QueryBuilder doRewrite(QueryRewriteContext queryRewriteContext) throws
357357

358358
try {
359359
// disable tracking of the @timestamp range for must_not clauses
360-
queryRewriteContext.setTrackRangeTimestampFromMillis(false);
360+
queryRewriteContext.setTrackTimeRangeFilterFrom(false);
361361
changed |= rewriteClauses(queryRewriteContext, mustNotClauses, newBuilder::mustNot);
362362
} finally {
363-
queryRewriteContext.setTrackRangeTimestampFromMillis(true);
363+
queryRewriteContext.setTrackTimeRangeFilterFrom(true);
364364
}
365365
changed |= rewriteClauses(queryRewriteContext, filterClauses, newBuilder::filter);
366366
try {
367367
// disable tracking of the @timestamp range for should clauses
368-
queryRewriteContext.setTrackRangeTimestampFromMillis(false);
368+
queryRewriteContext.setTrackTimeRangeFilterFrom(false);
369369
changed |= rewriteClauses(queryRewriteContext, shouldClauses, newBuilder::should);
370370
} finally {
371-
queryRewriteContext.setTrackRangeTimestampFromMillis(true);
371+
queryRewriteContext.setTrackTimeRangeFilterFrom(true);
372372
}
373373

374374
// early termination when must clause is empty and optional clauses is returning MatchNoneQueryBuilder

0 commit comments

Comments
 (0)