Use the facet string levels when computing the facet distribution

This commit is contained in:
Clément Renault 2021-07-04 18:11:26 +02:00 committed by Kerollmops
parent 5676b204dd
commit 081278dfd6
No known key found for this signature in database
GPG Key ID: 92ADA4E935E71FA4
3 changed files with 27 additions and 4 deletions

View File

@ -9,7 +9,7 @@ use roaring::RoaringBitmap;
use crate::error::{FieldIdMapMissingEntry, UserError}; use crate::error::{FieldIdMapMissingEntry, UserError};
use crate::facet::FacetType; use crate::facet::FacetType;
use crate::heed_codec::facet::FacetStringLevelZeroCodec; use crate::heed_codec::facet::FacetStringLevelZeroCodec;
use crate::search::facet::{FacetNumberIter, FacetNumberRange}; use crate::search::facet::{FacetNumberIter, FacetNumberRange, FacetStringIter};
use crate::{DocumentId, FieldId, Index, Result}; use crate::{DocumentId, FieldId, Index, Result};
/// The default number of values by facets that will /// The default number of values by facets that will
@ -134,6 +134,29 @@ impl<'a> FacetDistribution<'a> {
Ok(()) Ok(())
} }
fn facet_strings_distribution_from_facet_levels(
&self,
field_id: FieldId,
candidates: &RoaringBitmap,
distribution: &mut BTreeMap<String, u64>,
) -> heed::Result<()> {
let iter =
FacetStringIter::new_non_reducing(self.rtxn, self.index, field_id, candidates.clone())?;
for result in iter {
let (value, mut docids) = result?;
docids &= candidates;
if !docids.is_empty() {
distribution.insert(value.to_string(), docids.len());
}
if distribution.len() == self.max_values_by_facet {
break;
}
}
Ok(())
}
/// Placeholder search, a.k.a. no candidates were specified. We iterate throught the /// Placeholder search, a.k.a. no candidates were specified. We iterate throught the
/// facet values one by one and iterate on the facet level 0 for numbers. /// facet values one by one and iterate on the facet level 0 for numbers.
fn facet_values_from_raw_facet_database( fn facet_values_from_raw_facet_database(
@ -198,9 +221,8 @@ impl<'a> FacetDistribution<'a> {
candidates, candidates,
&mut distribution, &mut distribution,
)?; )?;
self.facet_distribution_from_documents( self.facet_strings_distribution_from_facet_levels(
field_id, field_id,
String,
candidates, candidates,
&mut distribution, &mut distribution,
)?; )?;

View File

@ -192,7 +192,7 @@ impl<'t> Iterator for FacetStringGroupRange<'t> {
}; };
if must_be_returned { if must_be_returned {
match docids.decode() { match docids.decode() {
Ok(docids) => Some(Ok(((level, left, right), docids))), Ok((bounds, docids)) => Some(Ok(((level, left, right), (bounds, docids)))),
Err(e) => Some(Err(e)), Err(e) => Some(Err(e)),
} }
} else { } else {

View File

@ -1,5 +1,6 @@
pub use self::facet_distribution::FacetDistribution; pub use self::facet_distribution::FacetDistribution;
pub use self::facet_number::{FacetNumberIter, FacetNumberRange, FacetNumberRevRange}; pub use self::facet_number::{FacetNumberIter, FacetNumberRange, FacetNumberRevRange};
pub use self::facet_string::FacetStringIter;
pub use self::filter_condition::{FilterCondition, Operator}; pub use self::filter_condition::{FilterCondition, Operator};
pub(crate) use self::parser::Rule as ParserRule; pub(crate) use self::parser::Rule as ParserRule;