mirror of
https://github.com/meilisearch/meilisearch.git
synced 2025-07-27 08:41:00 +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::error::{Code, ResponseError};
|
||||||
use meilisearch_types::heed::RoTxn;
|
use meilisearch_types::heed::RoTxn;
|
||||||
use meilisearch_types::index_uid::IndexUid;
|
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::update::IndexDocumentsMethod;
|
||||||
use meilisearch_types::milli::vector::parsed_vectors::ExplicitVectors;
|
use meilisearch_types::milli::vector::parsed_vectors::ExplicitVectors;
|
||||||
use meilisearch_types::milli::DocumentId;
|
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 (it, number_of_documents) = {
|
||||||
let number_of_documents = candidates.len();
|
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_type;
|
||||||
mod facet_value;
|
mod facet_value;
|
||||||
pub mod value_encoding;
|
pub mod value_encoding;
|
||||||
|
pub mod facet_sort_recursive;
|
||||||
|
|
||||||
pub use self::facet_type::FacetType;
|
pub use self::facet_type::FacetType;
|
||||||
pub use self::facet_value::FacetValue;
|
pub use self::facet_value::FacetValue;
|
||||||
|
Reference in New Issue
Block a user