Use this file to discover all available pages before exploring further.
Indexing is critical for fast vector similarity search at scale. Without indexes, Zvec must perform brute-force search by comparing the query vector against every document in the collection, which becomes prohibitively slow as your dataset grows.
from zvec import HnswIndexParam, IndexOption# Define HNSW parametersindex_param = HnswIndexParam( m=16, # Number of bi-directional links per node ef_construction=200, # Size of dynamic candidate list during construction ef=100 # Size of dynamic candidate list during search (optional))# Create index on vector fieldcollection.create_index( field_name="embedding", index_param=index_param, option=IndexOption())
from zvec import VectorQuery, HnswQueryParam# Adjust ef at query time for recall/speed tradeoffresults = collection.query( vectors=VectorQuery( field_name="embedding", vector=[0.1, 0.2, 0.3, ...], param=HnswQueryParam(ef=300) # Higher ef → better recall ), topk=10)
from zvec import IVFIndexParam, IndexOption# Define IVF parametersindex_param = IVFIndexParam( nlist=100, # Number of clusters nprobe=10 # Number of clusters to search)# Create indexcollection.create_index( field_name="embedding", index_param=index_param, option=IndexOption())
from zvec import FlatIndexParam# Flat index has no parametersindex_param = FlatIndexParam()collection.create_index( field_name="embedding", index_param=index_param)
from zvec import InvertIndexParam# Create inverted index on existing fieldcollection.create_index( field_name="category", index_param=InvertIndexParam())
Add inverted indexes to fields used in filter expressions:
from zvec import InvertIndexParam# Frequently filtered fieldscollection.create_index("category", InvertIndexParam())collection.create_index("status", InvertIndexParam())collection.create_index("user_id", InvertIndexParam())# Range queries benefit from range optimizationcollection.create_index( "price", InvertIndexParam(enable_range_optimization=True))
Rebuild indexes after bulk insertions or to apply new parameters:
# Drop old indexcollection.drop_index("embedding")# Create new index with updated parameterscollection.create_index( field_name="embedding", index_param=HnswIndexParam(m=32, ef_construction=400) # Higher quality)
num_vectors = collection.stats.doc_countif num_vectors < 10_000: # Use Flat index index_param = FlatIndexParam()elif num_vectors < 1_000_000: # Use HNSW with default parameters index_param = HnswIndexParam(m=16, ef_construction=200)else: # Use HNSW with higher m for better quality index_param = HnswIndexParam(m=32, ef_construction=400)
2
Consider memory constraints
# HNSW: High memory usage# - Memory ≈ N * m * 2 * sizeof(id) + N * dim * sizeof(float)# - Example: 1M vectors, 768D, m=16 → ~3.5 GB# IVF: Medium memory usage# - Memory ≈ N * dim * sizeof(float) + nlist * dim * sizeof(float)# - Example: 1M vectors, 768D, nlist=1000 → ~3 GB# Flat: Low memory usage# - Memory ≈ N * dim * sizeof(float)# - Example: 1M vectors, 768D → ~3 GB
3
Evaluate recall requirements
# Need 100% recall (exact search) → Use Flatif require_exact_search: index_param = FlatIndexParam()# Need 95-99% recall (approximate) → Use HNSW or IVFelse: index_param = HnswIndexParam(m=16, ef_construction=200)
Create indexes after inserting your data, not before:
# Good: insert first, then indexcollection.insert(docs) # Insert all documentscollection.create_index("embedding", HnswIndexParam()) # Then build index# Less efficient: index exists during insertionscollection.create_index("embedding", HnswIndexParam())collection.insert(docs) # Slower insertions
Monitor index quality
Test recall on a validation set:
# Get ground truth (exact search)exact_results = collection.query( vectors=VectorQuery(field_name="embedding", vector=query_vector), topk=100)exact_ids = {doc.id for doc in exact_results}# Get approximate resultsapprox_results = collection.query( vectors=VectorQuery( field_name="embedding", vector=query_vector, param=HnswQueryParam(ef=100) ), topk=100)approx_ids = {doc.id for doc in approx_results}# Calculate recallrecall = len(exact_ids & approx_ids) / len(exact_ids)print(f"Recall@100: {recall:.2%}")
Optimize after index creation
Run optimize to improve index quality:
from zvec import OptimizeOption# After creating index and inserting datacollection.create_index("embedding", HnswIndexParam())collection.optimize(option=OptimizeOption())