1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
//! # minimemory
//!
//! Base de datos híbrida embebida para Rust.
//! Como SQLite para documentos + búsqueda vectorial + full-text search.
//!
//! ## Características
//!
//! - **Sin servidor**: Librería embebida, solo importar y usar
//! - **Ligera**: Sin dependencias pesadas
//! - **Rápida**: Optimizada para alto rendimiento
//! - **Híbrida**: Combina vectores, BM25 y filtros de metadata
//! - **Flexible**: Múltiples métricas de distancia (Cosine, Euclidean, DotProduct)
//!
//! ## Inicio Rápido
//!
//! ```rust
//! use minimemory::{VectorDB, Config, Distance, IndexType};
//!
//! // Crear base de datos en memoria
//! let config = Config::new(4) // 4 dimensiones
//! .with_distance(Distance::Cosine)
//! .with_index(IndexType::Flat);
//!
//! let db = VectorDB::new(config).unwrap();
//!
//! // Insertar vectores
//! db.insert("doc-1", &[0.1, 0.2, 0.3, 0.4], None).unwrap();
//! db.insert("doc-2", &[0.2, 0.3, 0.4, 0.5], None).unwrap();
//!
//! // Buscar los 2 más similares
//! let query = [0.15, 0.25, 0.35, 0.45];
//! let results = db.search(&query, 2).unwrap();
//!
//! assert_eq!(results.len(), 2);
//! println!("Más cercano: {} (dist: {})", results[0].id, results[0].distance);
//! ```
//!
//! ## Documentos con Metadata (Sin Vector)
//!
//! ```rust
//! use minimemory::{VectorDB, Config, Metadata};
//!
//! // Crear DB con full-text search habilitado
//! let db = VectorDB::with_fulltext(
//! Config::new(3),
//! vec!["title".into(), "content".into()]
//! ).unwrap();
//!
//! // Insertar documento SIN vector (como MongoDB)
//! let mut meta = Metadata::new();
//! meta.insert("title", "Mi Post de Blog");
//! meta.insert("content", "Contenido del post...");
//! meta.insert("author", "Juan");
//!
//! db.insert_document("post-1", None, Some(meta)).unwrap();
//!
//! // Insertar documento CON vector (para búsqueda semántica)
//! let mut meta2 = Metadata::new();
//! meta2.insert("title", "Otro Post");
//! db.insert_document("post-2", Some(&[0.1, 0.2, 0.3]), Some(meta2)).unwrap();
//! ```
//!
//! ## Búsqueda Híbrida
//!
//! ```rust
//! use minimemory::{VectorDB, Config, Filter, HybridSearchParams};
//!
//! let db = VectorDB::with_fulltext(
//! Config::new(3),
//! vec!["title".into(), "content".into()]
//! ).unwrap();
//!
//! // Búsqueda por keywords (BM25)
//! let results = db.keyword_search("rust programming", 10).unwrap();
//!
//! // Búsqueda por filtros de metadata
//! let results = db.filter_search(
//! Filter::eq("author", "Juan"),
//! 10
//! ).unwrap();
//!
//! // Búsqueda vectorial con filtro
//! let results = db.search_with_filter(
//! &[0.1, 0.2, 0.3],
//! 10,
//! Filter::eq("category", "tech")
//! ).unwrap();
//!
//! // Búsqueda híbrida: vector + keyword + filtro
//! let params = HybridSearchParams::hybrid(
//! vec![0.1, 0.2, 0.3],
//! "rust",
//! 10
//! ).with_filter(Filter::eq("category", "tech"));
//! let results = db.hybrid_search(params).unwrap();
//! ```
//!
//! ## Filtros de Metadata
//!
//! ```rust
//! use minimemory::Filter;
//!
//! // Operadores básicos
//! Filter::eq("status", "active");
//! Filter::ne("status", "deleted");
//! Filter::gt("score", 0.5f64);
//! Filter::gte("count", 10i64);
//! Filter::lt("price", 100.0f64);
//!
//! // Operadores de colección
//! Filter::contains("tags", "rust");
//! Filter::starts_with("title", "How to");
//!
//! // Operadores lógicos
//! Filter::eq("category", "tech")
//! .and(Filter::gt("score", 0.5f64))
//! .or(Filter::eq("featured", true));
//!
//! // Acceso a campos anidados (dot notation)
//! Filter::eq("author.name", "Juan");
//! Filter::gt("metadata.views", 1000i64);
//! ```
//!
//! ## Métricas de Distancia
//!
//! - [`Distance::Cosine`] - Similitud coseno (ideal para embeddings de texto)
//! - [`Distance::Euclidean`] - Distancia L2 (para vectores normalizados)
//! - [`Distance::DotProduct`] - Producto punto (cuando la magnitud importa)
//!
//! ## Tipos Principales
//!
//! - [`VectorDB`] - Interfaz principal de la base de datos
//! - [`Config`] - Configuración de la base de datos
//! - [`Distance`] - Métricas de distancia disponibles
//! - [`IndexType`] - Tipos de índice (Flat, HNSW)
//! - [`Metadata`] - Metadata asociada a documentos
//! - [`SearchResult`] - Resultado de búsqueda vectorial
//! - [`HybridSearchResult`] - Resultado de búsqueda híbrida
//! - [`Filter`] - Filtros de metadata
//! - [`HybridSearchParams`] - Parámetros de búsqueda híbrida
// Local embeddings (optional)
// Bindings para otros lenguajes
pub use VectorDB;
pub use Distance;
pub use ;
pub use IndexType;
pub use ;
pub use ;
pub use ;
pub use ;