mirror of
https://github.com/meilisearch/MeiliSearch
synced 2024-11-11 23:48:56 +01:00
Build query graph more correctly from paths
Update snapshots
This commit is contained in:
parent
608ceea440
commit
2a7f9adf78
@ -6,8 +6,11 @@ use super::small_bitmap::SmallBitmap;
|
|||||||
use super::SearchContext;
|
use super::SearchContext;
|
||||||
use crate::search::new::interner::Interner;
|
use crate::search::new::interner::Interner;
|
||||||
use crate::Result;
|
use crate::Result;
|
||||||
|
use fxhash::{FxHashMap, FxHasher};
|
||||||
use std::cmp::Ordering;
|
use std::cmp::Ordering;
|
||||||
|
use std::collections::hash_map::Entry;
|
||||||
use std::collections::BTreeMap;
|
use std::collections::BTreeMap;
|
||||||
|
use std::hash::{Hash, Hasher};
|
||||||
|
|
||||||
/// A node of the [`QueryGraph`].
|
/// A node of the [`QueryGraph`].
|
||||||
///
|
///
|
||||||
@ -400,14 +403,29 @@ impl QueryGraph {
|
|||||||
paths_with_single_terms.push(processed_path);
|
paths_with_single_terms.push(processed_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: make a prefix tree of the processed paths to avoid uselessly duplicating nodes
|
let mut paths_with_single_terms_and_suffix_hash = vec![];
|
||||||
|
for path in paths_with_single_terms {
|
||||||
|
let mut hasher = FxHasher::default();
|
||||||
|
let mut path_with_hash = vec![];
|
||||||
|
for term in path.into_iter().rev() {
|
||||||
|
term.hash(&mut hasher);
|
||||||
|
path_with_hash.push((term, hasher.finish()));
|
||||||
|
}
|
||||||
|
path_with_hash.reverse();
|
||||||
|
paths_with_single_terms_and_suffix_hash.push(path_with_hash);
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut node_data_id_for_term_and_suffix_hash =
|
||||||
|
FxHashMap::<(LocatedQueryTermSubset, u64), Interned<QueryNodeData>>::default();
|
||||||
|
|
||||||
let mut paths_with_ids = vec![];
|
let mut paths_with_ids = vec![];
|
||||||
for path in paths_with_single_terms {
|
for path in paths_with_single_terms_and_suffix_hash {
|
||||||
let mut path_with_ids = vec![];
|
let mut path_with_ids = vec![];
|
||||||
for term in path {
|
for (term, suffix_hash) in path {
|
||||||
let id = node_data.push(QueryNodeData::Term(term));
|
let node_data_id = node_data_id_for_term_and_suffix_hash
|
||||||
path_with_ids.push(Interned::from_raw(id.into_raw()));
|
.entry((term.clone(), suffix_hash))
|
||||||
|
.or_insert_with(|| node_data.push(QueryNodeData::Term(term)));
|
||||||
|
path_with_ids.push(Interned::from_raw(node_data_id.into_raw()));
|
||||||
}
|
}
|
||||||
paths_with_ids.push(path_with_ids);
|
paths_with_ids.push(path_with_ids);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user