|
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