@@ -1174,9 +1174,10 @@ impl CanSplitDoBetter {
11741174 }
11751175}
11761176
1177- /// `multi_leaf_search` searches multiple indices and multiple splits.
1177+ /// Searches multiple splits, potentially in multiple indices, sitting on different storages and
1178+ /// having different doc mappings.
11781179#[ instrument( skip_all, fields( index = ?leaf_search_request. search_request. as_ref( ) . unwrap( ) . index_id_patterns) ) ]
1179- pub async fn multi_leaf_search (
1180+ pub async fn multi_index_leaf_search (
11801181 searcher_context : Arc < SearcherContext > ,
11811182 leaf_search_request : LeafSearchRequest ,
11821183 storage_resolver : & StorageResolver ,
@@ -1224,18 +1225,25 @@ pub async fn multi_leaf_search(
12241225 } ) ?
12251226 . clone ( ) ;
12261227
1227- let leaf_request_future = tokio:: spawn (
1228- resolve_storage_and_leaf_search (
1229- searcher_context. clone ( ) ,
1230- search_request. clone ( ) ,
1231- index_uri,
1232- storage_resolver. clone ( ) ,
1233- leaf_search_request_ref. split_offsets ,
1234- doc_mapper,
1235- aggregation_limits. clone ( ) ,
1236- )
1237- . in_current_span ( ) ,
1238- ) ;
1228+ let leaf_request_future = tokio:: spawn ( {
1229+ let storage_resolver = storage_resolver. clone ( ) ;
1230+ let searcher_context = searcher_context. clone ( ) ;
1231+ let search_request = search_request. clone ( ) ;
1232+ let aggregation_limits = aggregation_limits. clone ( ) ;
1233+ async move {
1234+ let storage = storage_resolver. resolve ( & index_uri) . await ?;
1235+ single_doc_mapping_leaf_search (
1236+ searcher_context,
1237+ search_request,
1238+ storage,
1239+ leaf_search_request_ref. split_offsets ,
1240+ doc_mapper,
1241+ aggregation_limits,
1242+ )
1243+ . await
1244+ }
1245+ . in_current_span ( )
1246+ } ) ;
12391247 leaf_request_tasks. push ( leaf_request_future) ;
12401248 }
12411249
@@ -1268,29 +1276,6 @@ pub async fn multi_leaf_search(
12681276 . context ( "failed to merge split search responses" ) ?
12691277}
12701278
1271- /// Resolves storage and calls leaf_search
1272- #[ allow( clippy:: too_many_arguments) ]
1273- async fn resolve_storage_and_leaf_search (
1274- searcher_context : Arc < SearcherContext > ,
1275- search_request : Arc < SearchRequest > ,
1276- index_uri : quickwit_common:: uri:: Uri ,
1277- storage_resolver : StorageResolver ,
1278- splits : Vec < SplitIdAndFooterOffsets > ,
1279- doc_mapper : Arc < DocMapper > ,
1280- aggregations_limits : AggregationLimitsGuard ,
1281- ) -> crate :: Result < LeafSearchResponse > {
1282- let storage = storage_resolver. resolve ( & index_uri) . await ?;
1283- leaf_search (
1284- searcher_context. clone ( ) ,
1285- search_request. clone ( ) ,
1286- storage. clone ( ) ,
1287- splits,
1288- doc_mapper,
1289- aggregations_limits,
1290- )
1291- . await
1292- }
1293-
12941279/// Optimizes the search_request based on CanSplitDoBetter
12951280/// Returns true if the split can return better results
12961281fn check_optimize_search_request (
@@ -1314,14 +1299,14 @@ fn disable_search_request_hits(search_request: &mut SearchRequest) {
13141299 search_request. sort_fields . clear ( ) ;
13151300}
13161301
1317- /// `leaf` step of search.
1302+ /// Searches multiple splits from a specific index and a single doc mapping
13181303///
13191304/// The leaf search collects all kind of information, and returns a set of
13201305/// [PartialHit](quickwit_proto::search::PartialHit) candidates. The root will be in
13211306/// charge to consolidate, identify the actual final top hits to display, and
13221307/// fetch the actual documents to convert the partial hits into actual Hits.
13231308#[ instrument( skip_all, fields( index = ?request. index_id_patterns) ) ]
1324- pub async fn leaf_search (
1309+ pub async fn single_doc_mapping_leaf_search (
13251310 searcher_context : Arc < SearcherContext > ,
13261311 request : Arc < SearchRequest > ,
13271312 index_storage : Arc < dyn Storage > ,
0 commit comments