# Vector Store Module
> **Store and search vector embeddings with lightning-fast approximate nearest neighbor search.**
---
## 🎯 Overview
- :material-database:{ .lg .middle } **Vector Storage**
---
Efficient storage of high-dimensional vectors with multiple backend support
- :material-magnify:{ .lg .middle } **Similarity Search**
---
Fast ANN search with HNSW, IVF, and PQ algorithms
- :material-merge:{ .lg .middle } **Hybrid Search**
---
Combine vector search with keyword/metadata filtering using RRF
- :material-cog:{ .lg .middle } **Index Management**
---
Multiple index types optimized for different use cases
- :material-flash:{ .lg .middle } **Batch Operations**
---
Efficient bulk insert and search with parallel processing
- :material-cloud:{ .lg .middle } **Multiple Backends**
---
FAISS, Pinecone, Qdrant, Weaviate, Milvus support
!!! tip "Choosing the Right Index"
- **Small datasets (<10K)**: Use Flat for exact search
- **Medium (10K-1M)**: Use IVF or HNSW
- **Large (>1M)**: Use HNSW with GPU
- **Memory constrained**: Use PQ for compression
---
## ⚙️ Algorithms Used
### Indexing Algorithms
- **Flat (Exact Search)**: Brute-force linear scan, O(n*d) complexity
- **IVF (Inverted File Index)**: Clustering-based search with k-means, O(√n*d) complexity
- **HNSW (Hierarchical Navigable Small World)**: Graph-based ANN, O(log n) search complexity
- **PQ (Product Quantization)**: Compression-based search, reduces memory footprint
- **LSH (Locality Sensitive Hashing)**: Hash-based approximate search
### Similarity Metrics
- **Cosine Similarity**: `cos(θ) = (A·B) / (||A|| * ||B||)`
- **Euclidean Distance**: `d = √(Σ(ai - bi)²)`
- **Dot Product**: `A·B = Σ(ai * bi)`
- **Manhattan Distance**: `d = Σ|ai - bi|`
### Hybrid Search Algorithms
- **RRF (Reciprocal Rank Fusion)**: `score = Σ(1/(k + rank_i))` where k=60
- **Weighted Combination**: `score = α*vector_score + (1-α)*keyword_score`
- **Cascade Filtering**: Vector search → metadata filtering → reranking
---
## Main Classes
### VectorStore
**Methods:**
| Method | Description | Algorithm |
|--------|-------------|-----------|
| `store(embeddings, documents, metadata)` | Store vectors with metadata | Batch insertion with index building |
| `search(query_vector, top_k, filters)` | Search similar vectors | ANN search with optional filtering |
| `delete(ids)` | Delete vectors by ID | Index update with tombstoning |
| `update(id, vector, metadata)` | Update vector/metadata | In-place update or delete+insert |
| `create_index(index_type, params)` | Create search index | Index-specific construction algorithm |
| `rebuild_index()` | Rebuild index from scratch | Full index reconstruction |
**Supported Backends:**
| Backend | Index Types | Best For |
|---------|-------------|----------|
| **FAISS** | Flat, IVF, HNSW, PQ | High performance, local deployment |
| **Pinecone** | Proprietary | Managed cloud service |
| **Qdrant** | HNSW | Production-ready, filtering support |
| **Weaviate** | HNSW | GraphQL API, hybrid search |
| **Milvus** | IVF, HNSW | Distributed, large-scale |
**Example:**
```python
from semantica.vector_store import VectorStore
# Initialize with FAISS backend
store = VectorStore(
backend="faiss",
index_type="HNSW", # Flat, IVF, HNSW, PQ
metric="cosine", # cosine, euclidean, dot_product
dimension=1536
)
# Store embeddings
store.store(
embeddings=embeddings,
documents=documents,
metadata=[{"source": "doc1.pdf", "page": 1}, ...]
)
# Search
results = store.search(
query_vector=query_embedding,
top_k=10,
filters={"source": "doc1.pdf"}
)
for result in results:
print(f"Score: {result.score:.3f}, Doc: {result.document}")
```
---
### HybridSearch
**Methods:**
| Method | Description | Algorithm |
|--------|-------------|-----------|
| `search(query, top_k)` | Hybrid search | Vector + keyword search with RRF fusion |
| `vector_search(query_vector, top_k)` | Vector-only search | ANN search |
| `keyword_search(query_text, top_k)` | Keyword-only search | BM25 or TF-IDF |
| `combine_results(vector_results, keyword_results)` | Merge results | RRF or weighted combination |
| `rerank(results, query)` | Rerank results | Cross-encoder reranking |
**Reciprocal Rank Fusion (RRF):**
```
RRF_score(d) = Σ(1/(k + rank_i(d)))
where k = 60 (constant), rank_i(d) = rank of document d in result set i
```
**Example:**
```python
from semantica.vector_store import HybridSearch
hybrid = HybridSearch(
vector_store=store,
keyword_index=keyword_index,
fusion_method="rrf", # rrf, weighted, cascade
vector_weight=0.7 # for weighted fusion
)
results = hybrid.search(
query="machine learning applications",
top_k=10
)
```
---
### VectorRetriever
**Methods:**
| Method | Description | Algorithm |
|--------|-------------|-----------|
| `retrieve(query, top_k)` | Retrieve relevant documents | Vector search + document fetching |
| `retrieve_batch(queries, top_k)` | Batch retrieval | Parallel vector search |
| `retrieve_with_context(query, context_size)` | Retrieve with context | Sliding window context expansion |
| `filter_by_metadata(results, filters)` | Filter by metadata | Post-search filtering |
---
## Index Types Comparison
### FAISS Index Types
| Index Type | Build Time | Search Time | Memory | Recall | Use Case |
|------------|------------|-------------|--------|--------|----------|
| **Flat** | O(1) | O(n*d) | High | 1.00 | Small datasets, exact search |
| **IVF** | O(n*d) | O(√n*d) | Medium | 0.95 | Medium datasets, good balance |
| **HNSW** | O(n*log n*d) | O(log n*d) | High | 0.98 | Large datasets, fast search |
| **PQ** | O(n*d) | O(n) | Low | 0.85 | Memory-constrained, compression |
### Index Parameters
**IVF Parameters:**
- `nlist`: Number of clusters (√n to 4√n recommended)
- `nprobe`: Number of clusters to search (1-nlist)
**HNSW Parameters:**
- `M`: Number of connections per layer (4-64, default: 16)
- `efConstruction`: Construction time accuracy (100-500)
- `efSearch`: Search time accuracy (efConstruction to 2*efConstruction)
**PQ Parameters:**
- `m`: Number of subquantizers (dimension/m should be divisible)
- `nbits`: Bits per subquantizer (8 is standard)
---
## Configuration
```yaml
# config.yaml - Vector Store Configuration
vector_store:
backend: faiss # faiss, pinecone, qdrant, weaviate, milvus
faiss:
index_type: HNSW # Flat, IVF, HNSW, PQ
metric: cosine # cosine, euclidean, dot_product
dimension: 1536
# HNSW parameters
hnsw_m: 16
hnsw_ef_construction: 200
hnsw_ef_search: 100
# IVF parameters
ivf_nlist: 100
ivf_nprobe: 10
hybrid_search:
fusion_method: rrf # rrf, weighted, cascade
vector_weight: 0.7
keyword_weight: 0.3
enable_reranking: true
batch_operations:
batch_size: 1000
parallel_workers: 4
```
---
## Performance Characteristics
### Search Complexity
| Index Type | Build | Search | Memory |
|------------|-------|--------|--------|
| Flat | O(1) | O(n*d) | O(n*d) |
| IVF | O(n*d*k) | O(√n*d) | O(n*d) |
| HNSW | O(n*log n*d) | O(log n*d) | O(n*d*M) |
| PQ | O(n*d) | O(n*m) | O(n*m) |
where n = vectors, d = dimensions, k = clusters, M = HNSW connections, m = subquantizers
### Scalability
- **Small (<10K vectors)**: Use Flat for exact search
- **Medium (10K-1M vectors)**: Use IVF or HNSW
- **Large (>1M vectors)**: Use HNSW with GPU or distributed systems
- **Very Large (>10M vectors)**: Use distributed backends (Milvus, Weaviate)
---
## See Also
- [Embeddings Module](embeddings.md) - Generate vector embeddings
- [Knowledge Graph Module](kg.md) - Graph-based retrieval
- [Core Module](core.md) - Framework orchestration