Implement sorting documents

This commit is contained in:
Mubelotix
2025-06-25 15:36:12 +02:00
parent ae8c1461e1
commit 6e0526090a
3 changed files with 82 additions and 0 deletions

View File

@ -17,6 +17,10 @@ use meilisearch_types::error::deserr_codes::*;
use meilisearch_types::error::{Code, ResponseError};
use meilisearch_types::heed::RoTxn;
use meilisearch_types::index_uid::IndexUid;
use meilisearch_types::milli::facet::facet_sort_recursive::recursive_facet_sort;
use meilisearch_types::milli::facet::{ascending_facet_sort, descending_facet_sort};
use meilisearch_types::milli::heed_codec::facet::FacetGroupKeyCodec;
use meilisearch_types::milli::heed_codec::BytesRefCodec;
use meilisearch_types::milli::update::IndexDocumentsMethod;
use meilisearch_types::milli::vector::parsed_vectors::ExplicitVectors;
use meilisearch_types::milli::DocumentId;
@ -1533,6 +1537,15 @@ fn retrieve_documents<S: AsRef<str>>(
})?
}
let fields = vec![(0, true)];
let number_db = index
.facet_id_f64_docids
.remap_key_type::<FacetGroupKeyCodec<BytesRefCodec>>();
let string_db = index
.facet_id_string_docids
.remap_key_type::<FacetGroupKeyCodec<BytesRefCodec>>();
candidates = recursive_facet_sort(&rtxn, number_db, string_db, &fields, candidates)?;
let (it, number_of_documents) = {
let number_of_documents = candidates.len();
(

View File

@ -0,0 +1,68 @@
use roaring::RoaringBitmap;
use heed::Database;
use crate::{facet::{ascending_facet_sort, descending_facet_sort}, heed_codec::{facet::{FacetGroupKeyCodec, FacetGroupValueCodec}, BytesRefCodec}};
pub fn recursive_facet_sort<'t>(
rtxn: &'t heed::RoTxn<'t>,
number_db: Database<FacetGroupKeyCodec<BytesRefCodec>, FacetGroupValueCodec>,
string_db: Database<FacetGroupKeyCodec<BytesRefCodec>, FacetGroupValueCodec>,
fields: &[(u16, bool)],
candidates: RoaringBitmap,
) -> heed::Result<RoaringBitmap> {
let (field_id, ascending) = match fields.first() {
Some(first) => *first,
None => return Ok(candidates),
};
let (number_iter, string_iter) = if ascending {
let number_iter = ascending_facet_sort(
rtxn,
number_db,
field_id,
candidates.clone(),
)?;
let string_iter = ascending_facet_sort(
rtxn,
string_db,
field_id,
candidates,
)?;
(itertools::Either::Left(number_iter), itertools::Either::Left(string_iter))
} else {
let number_iter = descending_facet_sort(
rtxn,
number_db,
field_id,
candidates.clone(),
)?;
let string_iter = descending_facet_sort(
rtxn,
string_db,
field_id,
candidates,
)?;
(itertools::Either::Right(number_iter), itertools::Either::Right(string_iter))
};
let chained_iter = number_iter.chain(string_iter);
let mut result = RoaringBitmap::new();
for part in chained_iter {
let (inner_candidates, _) = part?;
if inner_candidates.len() <= 1 || fields.len() <= 1 {
result |= inner_candidates;
} else {
let inner_candidates = recursive_facet_sort(
rtxn,
number_db,
string_db,
&fields[1..],
inner_candidates,
)?;
result |= inner_candidates;
}
}
Ok(result)
}

View File

@ -1,6 +1,7 @@
mod facet_type;
mod facet_value;
pub mod value_encoding;
pub mod facet_sort_recursive;
pub use self::facet_type::FacetType;
pub use self::facet_value::FacetValue;