Skip to main content

qdrant_edge/edge/config/
optimizers.rs

1//! Optimizer-related parameters for the edge shard.
2
3use serde::{Deserialize, Serialize};
4use crate::shard::optimizers::config::{
5    get_indexing_threshold_kb, get_max_segment_size_kb, get_number_segments,
6};
7
8/// Optimizer-related parameters for the edge shard.
9///
10/// Subset of collection-level `OptimizersConfig`: excludes `memmap_threshold`
11/// (deprecated), `flush_interval_sec` (edge does not flush on a timer), and
12/// `max_optimization_threads` (optimizations are manual).
13#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
14#[serde(rename_all = "snake_case", default)]
15pub struct EdgeOptimizersConfig {
16    /// Minimal fraction of deleted vectors in a segment required to run vacuum.
17    #[serde(default)]
18    pub deleted_threshold: Option<f64>,
19    /// Minimal number of vectors in a segment required to run vacuum.
20    #[serde(default)]
21    pub vacuum_min_vector_number: Option<usize>,
22    /// Target number of segments. If 0, chosen automatically from CPU count.
23    pub default_segment_number: Option<usize>,
24    /// Max segment size in KB. If not set, derived from CPU count.
25    #[serde(alias = "max_segment_size_kb")]
26    pub max_segment_size: Option<usize>,
27    /// Indexing threshold in KB; segments above this get HNSW index. If not set, default is used.
28    #[serde(alias = "indexing_threshold_kb")]
29    pub indexing_threshold: Option<usize>,
30    /// If true, block updates when unoptimized segments exceed indexing threshold.
31    #[serde(default)]
32    pub prevent_unoptimized: Option<bool>,
33}
34
35impl EdgeOptimizersConfig {
36    pub fn get_number_segments(&self) -> usize {
37        get_number_segments(self.default_segment_number.unwrap_or_default())
38    }
39
40    pub fn get_indexing_threshold_kb(&self) -> usize {
41        get_indexing_threshold_kb(self.indexing_threshold)
42    }
43
44    pub fn get_max_segment_size_kb(&self, num_indexing_threads: usize) -> usize {
45        get_max_segment_size_kb(self.max_segment_size, num_indexing_threads)
46    }
47}