Support the typoTolerant.enabled parameter

This commit is contained in:
Clément Renault 2023-04-27 16:04:03 +02:00 committed by Louis Dureuil
parent 8e86eb91bb
commit 7bd67543dd
No known key found for this signature in database

View File

@ -283,6 +283,7 @@ impl<'a> SearchForFacetValues<'a> {
.into()); .into());
} }
}; };
let fst = match self.search_query.index.facet_id_string_fst.get(rtxn, &BEU16::new(fid))? { let fst = match self.search_query.index.facet_id_string_fst.get(rtxn, &BEU16::new(fid))? {
Some(fst) => fst, Some(fst) => fst,
None => return Ok(vec![]), None => return Ok(vec![]),
@ -292,6 +293,7 @@ impl<'a> SearchForFacetValues<'a> {
match self.query.as_ref() { match self.query.as_ref() {
Some(query) => { Some(query) => {
if self.search_query.index.authorize_typos(rtxn)? {
let is_prefix = true; let is_prefix = true;
let starts = StartsWith(Str::new(get_first(query))); let starts = StartsWith(Str::new(get_first(query)));
let first = Intersection(build_dfa(query, 1, is_prefix), Complement(&starts)); let first = Intersection(build_dfa(query, 1, is_prefix), Complement(&starts));
@ -308,7 +310,9 @@ impl<'a> SearchForFacetValues<'a> {
let docids = match index.facet_id_string_docids.get(rtxn, &key)? { let docids = match index.facet_id_string_docids.get(rtxn, &key)? {
Some(FacetGroupValue { bitmap, .. }) => bitmap, Some(FacetGroupValue { bitmap, .. }) => bitmap,
None => { None => {
error!("the facet value is missing from the facet database: {key:?}"); error!(
"the facet value is missing from the facet database: {key:?}"
);
continue; continue;
} }
}; };
@ -323,6 +327,35 @@ impl<'a> SearchForFacetValues<'a> {
} }
Ok(result) Ok(result)
} else {
let automaton = StartsWith(Str::new(query));
let mut stream = fst.search(automaton).into_stream();
let mut result = vec![];
let mut length = 0;
while let Some(facet_value) = stream.next() {
let value = std::str::from_utf8(facet_value)?;
let key = FacetGroupKey { field_id: fid, level: 0, left_bound: value };
let docids = match index.facet_id_string_docids.get(rtxn, &key)? {
Some(FacetGroupValue { bitmap, .. }) => bitmap,
None => {
error!(
"the facet value is missing from the facet database: {key:?}"
);
continue;
}
};
let count = search_candidates.intersection_len(&docids);
if count != 0 {
result.push(FacetValueHit { value: value.to_string(), count });
length += 1;
}
if length >= MAX_NUMBER_OF_FACETS {
break;
}
}
Ok(result)
}
} }
None => { None => {
let mut stream = fst.stream(); let mut stream = fst.stream();