Collections are the fundamental organizational unit in LibraVDB. Each collection stores vectors of the same dimensionality and provides a consistent interface for insertion, search, and management operations.
A collection is a named container that holds:
- Vectors: Fixed-dimension float32 arrays
- Metadata: Optional key-value pairs for each vector
- Index: Optimized data structure for fast similarity search
- Configuration: Settings that define behavior and performance characteristics
collection, err := db.CreateCollection(
context.Background(),
"my_collection",
libravdb.WithDimension(768),
libravdb.WithMetric(libravdb.CosineDistance),
)// Insert individual vectors
err = collection.Insert(ctx, "doc1", vector, metadata)
// Batch insertions
stream := collection.NewStreamingBatchInsert(opts)
for _, entry := range entries {
stream.Send(entry)
}// Simple search
results, err := collection.Search(ctx, queryVector, 10)
// Advanced filtering
results, err := collection.Query(ctx).
WithVector(queryVector).
Eq("category", "documents").
Limit(10).
Execute()// Get statistics
stats := collection.Stats()
// Optimize performance
err = collection.OptimizeCollection(ctx, options)
// Close when done
err = collection.Close()collection, err := db.CreateCollection(ctx, "basic",
libravdb.WithDimension(768), // Vector size
libravdb.WithMetric(libravdb.CosineDistance), // Distance function
)Collections support multiple indexing algorithms:
Best for most use cases:
libravdb.WithHNSW(32, 200, 50)
// M: max connections per node
// EfConstruction: build-time search width
// EfSearch: query-time search widthExact search for small collections:
libravdb.WithFlat()Let LibraVDB choose the optimal index:
libravdb.WithAutoIndexSelection(true)collection, err := db.CreateCollection(ctx, "memory_managed",
libravdb.WithMemoryLimit(2*1024*1024*1024), // 2GB limit
libravdb.WithMemoryMapping(true), // Enable memory mapping
libravdb.WithCachePolicy(libravdb.LRUCache), // Cache eviction policy
)Reduce memory usage with quantization:
// Product Quantization
libravdb.WithProductQuantization(8, 8, 0.1)
// Scalar Quantization
libravdb.WithScalarQuantization(8, 0.1)Choose the appropriate distance metric for your data:
Best for normalized embeddings (most common):
libravdb.WithMetric(libravdb.CosineDistance)Use when:
- Working with text embeddings
- Vectors are normalized or should be treated as directions
- Magnitude is less important than direction
Standard geometric distance:
libravdb.WithMetric(libravdb.L2Distance)Use when:
- Working with image embeddings
- Magnitude matters
- Natural geometric interpretation needed
Dot product similarity:
libravdb.WithMetric(libravdb.InnerProduct)Use when:
- Working with non-normalized embeddings
- Want to favor larger magnitude vectors
- Implementing custom similarity functions
Define metadata structure for validation and optimization:
schema := libravdb.MetadataSchema{
"title": libravdb.StringField,
"category": libravdb.StringField,
"score": libravdb.FloatField,
"tags": libravdb.StringArrayField,
"created": libravdb.TimeField,
"published": libravdb.BoolField,
}
collection, err := db.CreateCollection(ctx, "structured",
libravdb.WithMetadataSchema(schema),
libravdb.WithIndexedFields("category", "score"), // Index for fast filtering
)StringField: Text valuesIntField: Integer numbersFloatField: Floating-point numbersBoolField: Boolean valuesTimeField: TimestampsStringArrayField: Array of stringsIntArrayField: Array of integersFloatArrayField: Array of floats
// Simple equality
results, err := collection.Query(ctx).
WithVector(queryVector).
Eq("category", "documents").
Execute()
// Range filtering
results, err := collection.Query(ctx).
WithVector(queryVector).
Between("score", 0.8, 1.0).
Execute()
// Complex logical operations
results, err := collection.Query(ctx).
WithVector(queryVector).
And().
Eq("category", "documents").
Or().
Gt("score", 0.9).
ContainsAny("tags", []interface{}{"important", "urgent"}).
End().
End().
Execute()Monitor collection health and performance:
stats := collection.Stats()
fmt.Printf("Collection: %s\n", stats.Name)
fmt.Printf("Vectors: %d\n", stats.VectorCount)
fmt.Printf("Dimension: %d\n", stats.Dimension)
fmt.Printf("Index Type: %s\n", stats.IndexType)
fmt.Printf("Memory Usage: %d MB\n", stats.MemoryUsage/1024/1024)
// Memory statistics (if memory management is enabled)
if stats.MemoryStats != nil {
fmt.Printf("Memory Limit: %d MB\n", stats.MemoryStats.Limit/1024/1024)
fmt.Printf("Memory Available: %d MB\n", stats.MemoryStats.Available/1024/1024)
fmt.Printf("Pressure Level: %s\n", stats.MemoryStats.PressureLevel)
}
// Optimization status
if stats.OptimizationStatus != nil {
fmt.Printf("Can Optimize: %v\n", stats.OptimizationStatus.CanOptimize)
fmt.Printf("Last Optimization: %v\n", stats.OptimizationStatus.LastOptimization)
}// Basic optimization
err = collection.OptimizeCollection(ctx, nil)
// Custom optimization options
options := &libravdb.OptimizationOptions{
RebuildIndex: true,
OptimizeMemory: true,
CompactStorage: true,
UpdateQuantization: false,
}
err = collection.OptimizeCollection(ctx, options)// Set memory limit
err = collection.SetMemoryLimit(4 * 1024 * 1024 * 1024) // 4GB
// Get current memory usage
usage, err := collection.GetMemoryUsage()
fmt.Printf("Total: %d MB\n", usage.Total/1024/1024)
fmt.Printf("Index: %d MB\n", usage.Indices/1024/1024)
fmt.Printf("Cache: %d MB\n", usage.Caches/1024/1024)
// Trigger garbage collection
err = collection.TriggerGC()Collections can automatically switch index types based on size:
// Enable automatic index selection
collection, err := db.CreateCollection(ctx, "adaptive",
libravdb.WithAutoIndexSelection(true),
)
// The collection will automatically use:
// - Flat index for <10K vectors
// - HNSW index for 10K-1M vectors
// - IVF-PQ index for >1M vectors- Use the same dimension as your embedding model
- Common dimensions: 128, 256, 384, 512, 768, 1024, 1536
- Higher dimensions = more memory usage and slower operations
- Cosine distance for most text embeddings
- L2 distance for image embeddings
- Inner product for custom similarity functions
- Set memory limits based on available system resources
- Enable memory mapping for large collections
- Use quantization to reduce memory usage
- Define schema for validation and optimization
- Index frequently filtered fields
- Keep metadata lightweight
- Check collection statistics regularly
- Monitor memory usage and pressure
- Optimize when performance degrades
- Start with HNSW for most use cases
- Use Flat for small collections or exact search
- Enable auto-selection for varying collection sizes
- Use streaming for large insertions
- Configure appropriate batch sizes
- Monitor insertion rates and adjust concurrency
collection, err := db.CreateCollection(ctx, "documents",
libravdb.WithDimension(768), // Common text embedding size
libravdb.WithMetric(libravdb.CosineDistance), // Good for text
libravdb.WithHNSW(32, 200, 100), // Balanced performance
libravdb.WithMetadataSchema(libravdb.MetadataSchema{
"title": libravdb.StringField,
"content": libravdb.StringField,
"category": libravdb.StringField,
"tags": libravdb.StringArrayField,
}),
libravdb.WithIndexedFields("category"), // Fast category filtering
)collection, err := db.CreateCollection(ctx, "images",
libravdb.WithDimension(512), // Common image embedding size
libravdb.WithMetric(libravdb.L2Distance), // Good for images
libravdb.WithMemoryMapping(true), // Handle large image datasets
libravdb.WithProductQuantization(8, 8, 0.1), // Reduce memory usage
)collection, err := db.CreateCollection(ctx, "high_throughput",
libravdb.WithDimension(256),
libravdb.WithAutoIndexSelection(true), // Adapt to size
libravdb.WithBatchChunkSize(5000), // Large batches
libravdb.WithBatchConcurrency(16), // High concurrency
libravdb.WithMemoryLimit(16*1024*1024*1024), // 16GB limit
)