|
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