mirror of
https://github.com/meilisearch/meilisearch.git
synced 2025-07-27 00:31:02 +00:00
Implement sorting documents
This commit is contained in:
@ -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();
|
||||
(
|
||||
|
68
crates/milli/src/facet/facet_sort_recursive.rs
Normal file
68
crates/milli/src/facet/facet_sort_recursive.rs
Normal 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)
|
||||
}
|
@ -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;
|
||||
|
Reference in New Issue
Block a user