mod bm25;
#[cfg(feature = "persistence")]
pub(crate) mod bm25_persistence;
#[cfg(feature = "persistence")]
#[cfg(test)]
mod bm25_persistence_tests;
#[cfg(feature = "persistence")]
pub(crate) mod bm25_persistence_wal;
#[cfg(test)]
mod bm25_tests;
pub mod hnsw;
mod posting_list;
#[cfg(test)]
mod posting_list_tests;
pub mod secondary;
pub mod sparse;
pub mod trigram;
pub use bm25::{Bm25Index, Bm25Params};
pub use hnsw::{HnswIndex, HnswParams, SearchQuality};
pub(crate) use secondary::{JsonValue, SecondaryIndex};
pub use sparse::{SparseInvertedIndex, SparseVector};
pub use trigram::{extract_trigrams, TrigramIndex};
use crate::distance::DistanceMetric;
use crate::scored_result::ScoredResult;
use std::cmp::Ordering;
pub(crate) fn top_k_partial_sort<T, F>(items: &mut Vec<T>, k: usize, cmp: F)
where
F: Fn(&T, &T) -> Ordering + Copy,
{
if items.len() > k {
items.select_nth_unstable_by(k, cmp);
items.truncate(k);
}
items.sort_by(cmp);
}
pub trait VectorIndex: Send + Sync {
fn insert(&self, id: u64, vector: &[f32]);
fn search(&self, query: &[f32], k: usize) -> Vec<ScoredResult>;
fn remove(&self, id: u64) -> bool;
fn len(&self) -> usize;
fn is_empty(&self) -> bool {
self.len() == 0
}
fn dimension(&self) -> usize;
fn metric(&self) -> DistanceMetric;
}