From d7a7560220d3b01a86b54cfc1eae071ebe59b0c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Renault?= Date: Thu, 16 Jan 2020 17:09:27 +0100 Subject: [PATCH] Use an union instead of a sort for prefix fetching --- meilisearch-core/src/query_tree.rs | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/meilisearch-core/src/query_tree.rs b/meilisearch-core/src/query_tree.rs index c7d32fd12..3dc0d79e2 100644 --- a/meilisearch-core/src/query_tree.rs +++ b/meilisearch-core/src/query_tree.rs @@ -397,25 +397,24 @@ pub fn traverse_query_tree<'o, 'txn>( array }; - let mut docids = Vec::new(); + let mut results: Vec<&Set<_>> = Vec::new(); // We retrieve the cached postings lists for all // the words that starts with this short prefix. let result = ctx.prefix_postings_lists.prefix_postings_list(reader, prefix)?.unwrap_or_default(); let key = PostingsKey { query, input: word.clone().into_bytes(), distance: 0, is_exact: false }; postings.insert(key, result.matches); - docids.extend_from_slice(&result.docids); + results.push(&result.docids); // We retrieve the exact postings list for the prefix, // because we must consider these matches as exact. - if let Some(result) = ctx.postings_lists.postings_list(reader, word.as_bytes())? { - let key = PostingsKey { query, input: word.clone().into_bytes(), distance: 0, is_exact: true }; - postings.insert(key, result.matches); - docids.extend_from_slice(&result.docids); - } + let result = ctx.postings_lists.postings_list(reader, word.as_bytes())?.unwrap_or_default(); + let key = PostingsKey { query, input: word.clone().into_bytes(), distance: 0, is_exact: true }; + postings.insert(key, result.matches); + results.push(&result.docids); let before = Instant::now(); - let docids = SetBuf::from_dirty(docids); + let docids = sdset::multi::Union::new(results).into_set_buf(); println!("{:2$}prefix docids construction took {:.02?}", "", before.elapsed(), depth * 2); Cow::Owned(docids)