Skip to content

Commit aae6742

Browse files
authored
Extend time range bucketing attributes to retrievers (#136072)
There's situations where the time range filter is provided as part of the retriever tree. In that case, we capture the time range filter from while parsing it, but we don't do the corresponding introspection of the retriever tree to extract which fields were the time range filters made against. This commit introduces a very basic introspection of retrievers and tests around it, expanding on #135549.
1 parent cce7d52 commit aae6742

File tree

6 files changed

+344
-84
lines changed

6 files changed

+344
-84
lines changed

docs/changelog/136072.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
pr: 136072
2+
summary: Extend time range bucketing attributes to retrievers
3+
area: Search
4+
type: enhancement
5+
issues: []

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

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,14 @@
2222
import org.elasticsearch.index.query.NestedQueryBuilder;
2323
import org.elasticsearch.index.query.QueryBuilder;
2424
import org.elasticsearch.index.query.RangeQueryBuilder;
25+
import org.elasticsearch.index.query.RankDocsQueryBuilder;
2526
import org.elasticsearch.search.SearchService;
2627
import org.elasticsearch.search.builder.SearchSourceBuilder;
2728
import org.elasticsearch.search.internal.ShardSearchRequest;
29+
import org.elasticsearch.search.retriever.CompoundRetrieverBuilder;
30+
import org.elasticsearch.search.retriever.KnnRetrieverBuilder;
31+
import org.elasticsearch.search.retriever.RetrieverBuilder;
32+
import org.elasticsearch.search.retriever.StandardRetrieverBuilder;
2833
import org.elasticsearch.search.sort.FieldSortBuilder;
2934
import org.elasticsearch.search.sort.ScoreSortBuilder;
3035
import org.elasticsearch.search.sort.SortBuilder;
@@ -108,7 +113,15 @@ private static Map<String, Object> extractAttributes(
108113
try {
109114
introspectQueryBuilder(searchSourceBuilder.query(), queryMetadataBuilder, 0);
110115
} catch (Exception e) {
111-
logger.error("Failed to extract query attribute", e);
116+
logger.error("Failed to extract query attributes", e);
117+
}
118+
}
119+
120+
if (searchSourceBuilder.retriever() != null) {
121+
try {
122+
introspectRetriever(searchSourceBuilder.retriever(), queryMetadataBuilder, 0);
123+
} catch (Exception e) {
124+
logger.error("Failed to extract retriever attributes", e);
112125
}
113126
}
114127

@@ -311,6 +324,14 @@ private static void introspectQueryBuilder(QueryBuilder queryBuilder, QueryMetad
311324
case NestedQueryBuilder nested:
312325
introspectQueryBuilder(nested.query(), queryMetadataBuilder, ++level);
313326
break;
327+
case RankDocsQueryBuilder rankDocs:
328+
QueryBuilder[] queryBuilders = rankDocs.getQueryBuilders();
329+
if (queryBuilders != null) {
330+
for (QueryBuilder builder : queryBuilders) {
331+
introspectQueryBuilder(builder, queryMetadataBuilder, level + 1);
332+
}
333+
}
334+
break;
314335
case RangeQueryBuilder range:
315336
// Note that the outcome of this switch differs depending on whether it is executed on the coord node, or data node.
316337
// Data nodes perform query rewrite on each shard. That means that a query that reports a certain time range filter at the
@@ -338,6 +359,26 @@ private static void introspectQueryBuilder(QueryBuilder queryBuilder, QueryMetad
338359
}
339360
}
340361

362+
private static void introspectRetriever(RetrieverBuilder retrieverBuilder, QueryMetadataBuilder queryMetadataBuilder, int level) {
363+
if (level > 20) {
364+
return;
365+
}
366+
switch (retrieverBuilder) {
367+
case KnnRetrieverBuilder knn:
368+
queryMetadataBuilder.knnQuery = true;
369+
break;
370+
case StandardRetrieverBuilder standard:
371+
introspectQueryBuilder(standard.topDocsQuery(), queryMetadataBuilder, level + 1);
372+
break;
373+
case CompoundRetrieverBuilder<?> compound:
374+
for (CompoundRetrieverBuilder.RetrieverSource retrieverSource : compound.innerRetrievers()) {
375+
introspectRetriever(retrieverSource.retriever(), queryMetadataBuilder, level + 1);
376+
}
377+
break;
378+
default:
379+
}
380+
}
381+
341382
private enum TimeRangeBucket {
342383
FifteenMinutes(TimeValue.timeValueMinutes(15).getMillis(), "15_minutes"),
343384
OneHour(TimeValue.timeValueHours(1).getMillis(), "1_hour"),

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,10 @@ protected void doWriteTo(StreamOutput out) throws IOException {
9191
}
9292
}
9393

94+
public QueryBuilder[] getQueryBuilders() {
95+
return queryBuilders;
96+
}
97+
9498
@Override
9599
public String getWriteableName() {
96100
return NAME;

0 commit comments

Comments
 (0)