Utility suite for sparse vectorization and document reranking using zvec
Project description
zvec-db

Sparse/dense vectorization and document reranking toolkit for zvec.
zvec-db provides:
- 🚀 Hybrid search - Combine sparse (BM25) and dense (semantic) vectors with full-text search
- 🔄 Score fusion - Weighted fusion and Reciprocal Rank Fusion (RRF)
- 🎯 Cross-encoder reranking - Two-stage retrieval with local or API-based rerankers
- 📦 6 sparse embedders - BM25, BM25L, BM25+, TF-IDF, Count, DisMax
- 🔧 Normalization - Bayesian, minmax, percentile, and arctan-based normalization
- ⚡ Native fast path - C++ acceleration for fusion rerankers
Quick Start
pip install zvec-db
Complete Example: Hybrid Search with RerankPipeline
from zvec_db import search, RerankPipeline, ScoreNormalizer, WeightedReranker
from zvec_db.rerankers import SentenceTransformerReranker
from zvec_db.embedders import BM25Embedder, SentenceTransformersEmbedder
import zvec
# 1. Open collection and initialize embedders
collection = zvec.open("./my_collection")
bm25 = BM25Embedder(max_features=4096).load("./bm25.joblib")
dense = SentenceTransformersEmbedder(model_name="all-MiniLM-L6-v2")
# 2. Create rerank pipeline with auto-detection from schema
reranker = RerankPipeline(
normalizer=ScoreNormalizer(
method="bayes",
schema=collection.schema, # Auto-detect metrics (COSINE, L2, IP)
),
fusion=WeightedReranker(
weights={"sparse": 0.5, "dense": 0.3, "text": 0.2},
topk=16, # Top 16 after fusion
),
cross_encoder=SentenceTransformerReranker(
model_name="cross-encoder/ms-marco-MiniLM-L-6-v2",
topk=8, # Top 8 after cross-encoder
),
)
# 3. Search with full pipeline
results = search(
collection=collection,
query="neural networks",
sparse_fields={"sparse": bm25},
dense_fields={"dense": dense},
fts_fields="text",
reranker=reranker,
topk=32, # Fetch 32 candidates
)
for doc in results:
print(f"{doc.fields['text']} (score: {doc.score:.4f})")
Simple Search (No Reranking)
from zvec_db import search
results = search(
collection=collection,
query="neural networks",
sparse_fields={"sparse": bm25},
dense_fields={"dense": dense},
topk=10,
)
Custom Fusion Only
from zvec_db.rerankers import WeightedReranker
# List weights enable C++ fast path (2-5x faster)
reranker = WeightedReranker(weights=[0.7, 0.3])
results = search(
collection=collection,
query="neural networks",
sparse_fields={"sparse": bm25},
dense_fields={"dense": dense},
reranker=reranker,
)
API Reference
search() Parameters
| Parameter | Type | Description |
|---|---|---|
collection |
zvec.Collection |
Collection to search |
query |
str |
Query text |
sparse_fields |
dict[str, Embedder] |
Sparse fields (e.g., {"sparse": bm25}) |
dense_fields |
dict[str, Embedder] |
Dense fields (e.g., {"dense": dense}) |
fts_fields |
str | list[str] |
FTS fields |
reranker |
Reranker |
Reranker instance |
topk |
int |
Results to return |
output_fields |
list[str] |
Fields to include |
Reranker Types
| Type | Description |
|---|---|
WeightedReranker(weights={...}) |
Weighted fusion |
RrfReranker() |
Reciprocal Rank Fusion |
SentenceTransformerReranker() |
Cross-encoder |
RerankPipeline(normalizer=..., fusion=..., cross_encoder=...) |
Full pipeline |
Embedders
Sparse (lexical): BM25Embedder (recommended), BM25LEmbedder, BM25PlusEmbedder, TfidfEmbedder, CountEmbedder, DisMaxEmbedder
Dense (semantic): SentenceTransformersEmbedder, OpenAIEmbedder
from zvec_db import BM25Embedder, SentenceTransformersEmbedder
bm25 = BM25Embedder(max_features=4096).load("./bm25.joblib")
dense = SentenceTransformersEmbedder(model_name="all-MiniLM-L6-v2")
bm25.save("bm25.joblib")
Rerankers
Fusion: WeightedReranker (weighted sum), RrfReranker (rank-based)
Cross-Encoder: SentenceTransformerReranker, OpenAIReranker
Pipeline: RerankPipeline (normalization + fusion + cross-encoder)
from zvec_db import RerankPipeline, ScoreNormalizer, WeightedReranker
from zvec_db.rerankers import SentenceTransformerReranker
# Full pipeline with schema auto-detection
pipeline = RerankPipeline(
normalizer=ScoreNormalizer(method="bayes", schema=collection.schema),
fusion=WeightedReranker(weights={"sparse": 0.7, "dense": 0.3}),
cross_encoder=SentenceTransformerReranker(topk=10),
)
Performance tip: Use list weights for C++ fast path: WeightedReranker(weights=[0.7, 0.3])
Documentation
- User Guide — Complete examples
- API Reference — Full API docs
License
MIT License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file zvec_db-0.15.0.tar.gz.
File metadata
- Download URL: zvec_db-0.15.0.tar.gz
- Upload date:
- Size: 82.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5738ddb8b5cfa2703de2f3ac1f7e5c246dbb168f0f36f89823f4da85384ef8ea
|
|
| MD5 |
e3880279ef484abfdd3eacd911a0c586
|
|
| BLAKE2b-256 |
1163b02bcee3850a3b7c115dc6ff7af8463251c4a029d75f120dbb3dbc32d7c3
|
File details
Details for the file zvec_db-0.15.0-py3-none-any.whl.
File metadata
- Download URL: zvec_db-0.15.0-py3-none-any.whl
- Upload date:
- Size: 105.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9771daccb3b6c4b5394e497e7ab8115f51e55f53f19bced5bfbe8e605ff8e2bd
|
|
| MD5 |
53727c946b345cd2788ff0c2529da2dc
|
|
| BLAKE2b-256 |
5fe776c0dad38f16269321cc03a5631c77b3a7b81cfd96a83e4e12c7592f98e8
|