diff --git a/infos/src/main.rs b/infos/src/main.rs index a00c882b7..d6aa1f854 100644 --- a/infos/src/main.rs +++ b/infos/src/main.rs @@ -157,6 +157,8 @@ enum Command { prefixes: Vec, }, + /// Outputs a CSV with the documents ids along with + /// the field id and the word count where it appears. FieldIdWordCountDocids { /// Display the whole documents ids in details. #[structopt(long)] @@ -714,8 +716,8 @@ fn field_id_word_count_docids( .id(&field_name) .with_context(|| format!("unknown field name: {}", &field_name))?; - let left = (field_id, 1); - let right = (field_id, 11); + let left = (field_id, 0); + let right = (field_id, u8::max_value()); let iter = index.field_id_word_count_docids .range(rtxn, &(left..=right))?; diff --git a/milli/src/search/criteria/exactness.rs b/milli/src/search/criteria/exactness.rs index 7f27287b7..4d9e54f6e 100644 --- a/milli/src/search/criteria/exactness.rs +++ b/milli/src/search/criteria/exactness.rs @@ -1,9 +1,10 @@ +use std::convert::TryFrom; use std::mem::take; +use std::ops::BitOr; use log::debug; use roaring::RoaringBitmap; use itertools::Itertools; -use std::ops::BitOr; use crate::search::query_tree::{Operation, PrimitiveQueryPart}; use crate::search::criteria::{ @@ -162,23 +163,24 @@ fn resolve_state( use State::*; match state { ExactAttribute(mut allowed_candidates) => { - let query_len = query.len() as u8; let mut candidates = RoaringBitmap::new(); - let attributes_ids = ctx.searchable_fields_ids()?; - for id in attributes_ids { - if let Some(attribute_allowed_docids) = ctx.field_id_word_count_docids(id, query_len)? { - let mut attribute_candidates_array = attribute_start_with_docids(ctx, id as u32, query)?; - attribute_candidates_array.push(attribute_allowed_docids); - candidates |= intersection_of(attribute_candidates_array.iter().collect()); + if let Ok(query_len) = u8::try_from(query.len()) { + let attributes_ids = ctx.searchable_fields_ids()?; + for id in attributes_ids { + if let Some(attribute_allowed_docids) = ctx.field_id_word_count_docids(id, query_len)? { + let mut attribute_candidates_array = attribute_start_with_docids(ctx, id as u32, query)?; + attribute_candidates_array.push(attribute_allowed_docids); + candidates |= intersection_of(attribute_candidates_array.iter().collect()); + } } + + // only keep allowed candidates + candidates &= &allowed_candidates; + // remove current candidates from allowed candidates + allowed_candidates -= &candidates; } - // only keep allowed candidates - candidates &= &allowed_candidates; - // remove current candidates from allowed candidates - allowed_candidates -= &candidates; Ok((candidates, Some(AttributeStartsWith(allowed_candidates)))) - }, AttributeStartsWith(mut allowed_candidates) => { let mut candidates = RoaringBitmap::new();