@@ -1177,9 +1177,10 @@ impl CanSplitDoBetter {
1177
1177
}
1178
1178
}
1179
1179
1180
- /// `multi_leaf_search` searches multiple indices and multiple splits.
1180
+ /// Searches multiple splits, potentially in multiple indices, sitting on different storages and
1181
+ /// having different doc mappings.
1181
1182
#[ instrument( skip_all, fields( index = ?leaf_search_request. search_request. as_ref( ) . unwrap( ) . index_id_patterns) ) ]
1182
- pub async fn multi_leaf_search (
1183
+ pub async fn multi_index_leaf_search (
1183
1184
searcher_context : Arc < SearcherContext > ,
1184
1185
leaf_search_request : LeafSearchRequest ,
1185
1186
storage_resolver : & StorageResolver ,
@@ -1227,18 +1228,25 @@ pub async fn multi_leaf_search(
1227
1228
} ) ?
1228
1229
. clone ( ) ;
1229
1230
1230
- let leaf_request_future = tokio:: spawn (
1231
- resolve_storage_and_leaf_search (
1232
- searcher_context. clone ( ) ,
1233
- search_request. clone ( ) ,
1234
- index_uri,
1235
- storage_resolver. clone ( ) ,
1236
- leaf_search_request_ref. split_offsets ,
1237
- doc_mapper,
1238
- aggregation_limits. clone ( ) ,
1239
- )
1240
- . in_current_span ( ) ,
1241
- ) ;
1231
+ let leaf_request_future = tokio:: spawn ( {
1232
+ let storage_resolver = storage_resolver. clone ( ) ;
1233
+ let searcher_context = searcher_context. clone ( ) ;
1234
+ let search_request = search_request. clone ( ) ;
1235
+ let aggregation_limits = aggregation_limits. clone ( ) ;
1236
+ async move {
1237
+ let storage = storage_resolver. resolve ( & index_uri) . await ?;
1238
+ single_doc_mapping_leaf_search (
1239
+ searcher_context,
1240
+ search_request,
1241
+ storage,
1242
+ leaf_search_request_ref. split_offsets ,
1243
+ doc_mapper,
1244
+ aggregation_limits,
1245
+ )
1246
+ . await
1247
+ }
1248
+ . in_current_span ( )
1249
+ } ) ;
1242
1250
leaf_request_tasks. push ( leaf_request_future) ;
1243
1251
}
1244
1252
@@ -1271,29 +1279,6 @@ pub async fn multi_leaf_search(
1271
1279
. context ( "failed to merge split search responses" ) ?
1272
1280
}
1273
1281
1274
- /// Resolves storage and calls leaf_search
1275
- #[ allow( clippy:: too_many_arguments) ]
1276
- async fn resolve_storage_and_leaf_search (
1277
- searcher_context : Arc < SearcherContext > ,
1278
- search_request : Arc < SearchRequest > ,
1279
- index_uri : quickwit_common:: uri:: Uri ,
1280
- storage_resolver : StorageResolver ,
1281
- splits : Vec < SplitIdAndFooterOffsets > ,
1282
- doc_mapper : Arc < DocMapper > ,
1283
- aggregations_limits : AggregationLimitsGuard ,
1284
- ) -> crate :: Result < LeafSearchResponse > {
1285
- let storage = storage_resolver. resolve ( & index_uri) . await ?;
1286
- leaf_search (
1287
- searcher_context. clone ( ) ,
1288
- search_request. clone ( ) ,
1289
- storage. clone ( ) ,
1290
- splits,
1291
- doc_mapper,
1292
- aggregations_limits,
1293
- )
1294
- . await
1295
- }
1296
-
1297
1282
/// Optimizes the search_request based on CanSplitDoBetter
1298
1283
/// Returns true if the split can return better results
1299
1284
fn check_optimize_search_request (
@@ -1317,14 +1302,14 @@ fn disable_search_request_hits(search_request: &mut SearchRequest) {
1317
1302
search_request. sort_fields . clear ( ) ;
1318
1303
}
1319
1304
1320
- /// `leaf` step of search.
1305
+ /// Searches multiple splits from a specific index and a single doc mapping
1321
1306
///
1322
1307
/// The leaf search collects all kind of information, and returns a set of
1323
1308
/// [PartialHit](quickwit_proto::search::PartialHit) candidates. The root will be in
1324
1309
/// charge to consolidate, identify the actual final top hits to display, and
1325
1310
/// fetch the actual documents to convert the partial hits into actual Hits.
1326
1311
#[ instrument( skip_all, fields( index = ?request. index_id_patterns) ) ]
1327
- pub async fn leaf_search (
1312
+ pub async fn single_doc_mapping_leaf_search (
1328
1313
searcher_context : Arc < SearcherContext > ,
1329
1314
request : Arc < SearchRequest > ,
1330
1315
index_storage : Arc < dyn Storage > ,
0 commit comments