feox-vector 0.1.0

Embedded vector store on FeOxDB - exact and ANN cosine search with metadata filtering
Documentation
use std::collections::BTreeMap;

use serde::{Deserialize, Serialize};
use serde_json::Value;

pub type VectorMetadata = BTreeMap<String, Value>;

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct VectorRecord {
    pub id: String,
    pub values: Vec<f32>,
    #[serde(default)]
    pub metadata: VectorMetadata,
    pub created_at_ms: u64,
    pub updated_at_ms: u64,
}

#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct VectorUpsertRecord {
    pub id: String,
    pub values: Vec<f32>,
    #[serde(default)]
    pub metadata: VectorMetadata,
}

#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct VectorUpsertInput {
    pub records: Vec<VectorUpsertRecord>,
}

#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct VectorUpsertResult {
    pub upserted: usize,
}

#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct VectorQueryInput {
    pub vector: Vec<f32>,
    pub top_k: Option<usize>,
    #[serde(default)]
    pub filter: VectorMetadata,
    pub min_score: Option<f32>,
    pub mode: Option<VectorQueryMode>,
    pub ef_search: Option<usize>,
    pub candidate_limit: Option<usize>,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum VectorQueryMode {
    Exact,
    Ann,
}

#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct VectorMatch {
    pub id: String,
    pub score: f32,
    #[serde(default)]
    pub metadata: VectorMetadata,
}

#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct VectorQueryResult {
    pub matches: Vec<VectorMatch>,
}

#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct VectorDeleteInput {
    pub ids: Vec<String>,
}

#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct VectorDeleteResult {
    pub deleted: usize,
}

#[derive(Debug, thiserror::Error)]
pub enum VectorError {
    #[error("store error: {0}")]
    Store(#[from] crate::storage::StoreError),
    #[error("ann error: {0}")]
    Ann(#[from] feox_ann::AnnError),
    #[error("json error: {0}")]
    Json(#[from] serde_json::Error),
    #[error("invalid vector operation: {0}")]
    Invalid(String),
}