| 
22 | 22 | import org.elasticsearch.index.query.NestedQueryBuilder;  | 
23 | 23 | import org.elasticsearch.index.query.QueryBuilder;  | 
24 | 24 | import org.elasticsearch.index.query.RangeQueryBuilder;  | 
 | 25 | +import org.elasticsearch.index.query.RankDocsQueryBuilder;  | 
25 | 26 | import org.elasticsearch.search.SearchService;  | 
26 | 27 | import org.elasticsearch.search.builder.SearchSourceBuilder;  | 
27 | 28 | 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;  | 
28 | 33 | import org.elasticsearch.search.sort.FieldSortBuilder;  | 
29 | 34 | import org.elasticsearch.search.sort.ScoreSortBuilder;  | 
30 | 35 | import org.elasticsearch.search.sort.SortBuilder;  | 
@@ -108,7 +113,15 @@ private static Map<String, Object> extractAttributes(  | 
108 | 113 |             try {  | 
109 | 114 |                 introspectQueryBuilder(searchSourceBuilder.query(), queryMetadataBuilder, 0);  | 
110 | 115 |             } 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);  | 
112 | 125 |             }  | 
113 | 126 |         }  | 
114 | 127 | 
 
  | 
@@ -311,6 +324,14 @@ private static void introspectQueryBuilder(QueryBuilder queryBuilder, QueryMetad  | 
311 | 324 |             case NestedQueryBuilder nested:  | 
312 | 325 |                 introspectQueryBuilder(nested.query(), queryMetadataBuilder, ++level);  | 
313 | 326 |                 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;  | 
314 | 335 |             case RangeQueryBuilder range:  | 
315 | 336 |                 // Note that the outcome of this switch differs depending on whether it is executed on the coord node, or data node.  | 
316 | 337 |                 // 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  | 
338 | 359 |         }  | 
339 | 360 |     }  | 
340 | 361 | 
 
  | 
 | 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 | + | 
341 | 382 |     private enum TimeRangeBucket {  | 
342 | 383 |         FifteenMinutes(TimeValue.timeValueMinutes(15).getMillis(), "15_minutes"),  | 
343 | 384 |         OneHour(TimeValue.timeValueHours(1).getMillis(), "1_hour"),  | 
 | 
0 commit comments