diff --git a/crates/milli/src/index.rs b/crates/milli/src/index.rs index 2e6b16fb6..aa96a9c7f 100644 --- a/crates/milli/src/index.rs +++ b/crates/milli/src/index.rs @@ -10,11 +10,12 @@ use roaring::RoaringBitmap; use rstar::RTree; use serde::{Deserialize, Serialize}; +use crate::attribute_patterns::PatternMatch; use crate::constants::{RESERVED_GEO_FIELD_NAME, RESERVED_VECTORS_FIELD_NAME}; use crate::documents::PrimaryKey; use crate::error::{InternalError, UserError}; use crate::fields_ids_map::FieldsIdsMap; -use crate::filterable_fields::matching_field_ids; +use crate::filterable_fields::{match_pattern_by_features, matching_field_ids}; use crate::heed_codec::facet::{ FacetGroupKeyCodec, FacetGroupValueCodec, FieldDocIdFacetF64Codec, FieldDocIdFacetStringCodec, FieldIdCodec, OrderedF64Codec, @@ -895,6 +896,27 @@ impl Index { Ok(geo_filter) } + /// Returns the field ids of the fields that are filterable using the ordering operators or are sortable. + pub fn facet_leveled_field_ids(&self, rtxn: &RoTxn<'_>) -> Result> { + let filterable_fields = self.filterable_fields(rtxn)?; + let sortable_fields = self.sortable_fields(rtxn)?; + let fields_ids_map = self.fields_ids_map(rtxn)?; + + let mut fields_ids = Vec::new(); + for (field_id, field_name) in fields_ids_map.iter() { + if match_pattern_by_features(field_name, &filterable_fields, &|features| { + features.is_filterable_order() + }) == PatternMatch::Match + { + fields_ids.push(field_id); + } else if sortable_fields.contains(field_name) { + fields_ids.push(field_id); + } + } + + Ok(fields_ids) + } + // /// Returns the faceted fields names. // pub fn faceted_fields(&self, rtxn: &RoTxn<'_>) -> heed::Result> { // Ok(self diff --git a/crates/milli/src/update/facet/mod.rs b/crates/milli/src/update/facet/mod.rs index dbacf6248..6743dfc3f 100644 --- a/crates/milli/src/update/facet/mod.rs +++ b/crates/milli/src/update/facet/mod.rs @@ -156,8 +156,7 @@ impl<'i> FacetsUpdate<'i> { // See self::comparison_bench::benchmark_facet_indexing if self.data_size >= (self.database.len(wtxn)? / 500) { - let field_ids = - self.index.faceted_fields_ids(wtxn)?.iter().copied().collect::>(); + let field_ids = self.index.facet_leveled_field_ids(wtxn)?; let bulk_update = FacetsUpdateBulk::new( self.index, field_ids,