🚀 Zvec v0.6.0 Release Notes
📦 New Features
- Turbo Quantizer Abstraction: Introduced a pluggable Quantizer abstraction in the Turbo module with a uniform interface that future quantizers (int8 uniform, int8 record, PQ, RaBitQ, …) can implement, decoupling quantization logic from index builders and searchers. Includes the first concrete
Fp32Quantizerimplementation and scalar FP32 distance kernels. (#546) - Random Rotation for INT8/INT4 Quantization: Added an optional random rotation feature to INT8/INT4 quantization, distributing variance evenly across vector dimensions to reduce quantization error and improve recall. On cohere-1m: HNSW INT8 recall improved from 0.9285 → 0.9397, Flat INT8 from 0.9695 → 0.9881; INT4 recall improved dramatically (HNSW 0.2114 → 0.7117). (#483)
- Group-By Search: Zvec now supports group-by search (a.k.a. group-by deduplication) across the core interface, algorithm, and DB layers. Users can retrieve top-K results per group instead of globally, with support for
fetch_vector,is_linear, andbf_pksquery modes on Flat, HNSW, HNSW-RaBitQ, and sparse indexes. Group-by is now also exposed in the Python API. (#527, #561) - Zero-Copy Python Vector Query: Replaced
serialize_vectormemcpy withVectorViewClausethat points directly at the numpy buffer, eliminating redundant memory copies for Python dense vector queries. (#517) - UTF-8 Tokenizer & ASCII Folding: Integrated utf8proc 2.11.3 to upgrade the FTS text analysis pipeline with full Unicode support — Unicode-aware word boundary detection, codepoint-aware lowercase conversion, and a new ASCII folding token filter that converts Unicode characters to ASCII equivalents. (#515)
- Standard Tokenizer (UAX #29): Replaced the previous general-category tokenizer with Unicode 17 UAX #29 word-boundary tables generated from official Unicode data, implementing Lucene-style token selection for alphanumeric, numeric, ideographic, hiragana, katakana, hangul, southeast Asian, regional indicator, and common emoji sequences. (#547)
- Stemmer Token Filter: Added a stemmer token filter for FTS based on Snowball 3.1.1, reducing words to their root form with support for 34+ languages configurable via
stemmer_langinextra_params. (#513) - DiskANN C API: Added complete DiskANN C API interfaces including index params setter/getters, query params with CRUD operations, and query wiring for vector query / group-by vector query / sub-query, following existing HNSW/FTS patterns. (#495)
🚀 Performance Improvements
- Faster FTS Conjunction Queries: Added block-max skip and score early-exit to
ConjunctionIterator— skip entire non-competitive blocks (128 docs) by checking block-max score upper bounds, and short-circuit score accumulation when remaining upper bound cannot beat the threshold. Benchmark (500k docs, quora dataset): AND queries 22–38% faster, phrase queries 33% faster. (#441) - IVF Index Optimization: Miscellaneous optimizations in IVF index internals. (#528)
🐞 Bug Fixes
- FTS Correctness: Fixed segment stats not written on reopen, zero-match filter semantics, global doc id gaps during compaction, and snapshot read-only indexes without flush. (#566, #584, #588, #569)
- Index Stability: Fixed lost-wakeup race in DiskANN and HNSW sparse builder progress loops, IVF nprobe selected list scanning, and miscellaneous IVF index bugs. (#530, #544, #524)
- SQL Engine: Fixed misused
group_count/group_topkin the SQL engine. (#531) - Collection: Fixed LOCK file to open read-only when collection is read-only, and preserved the live writing segment across CreateIndex/DropIndex DDL failures so persisted-segment tasks no longer corrupt the active segment. (#541, #574)
- Python Bindings: Added query validation during execution to catch invalid queries early. (#538)
- Build Fixes: Propagated compiler settings to Arrow ExternalProject, propagated
CMAKE_C_COMPILERto LZ4, fixed C API duplicated & mismatched definitions, and accepted Xcode 26.5's renamed libtool version string in iOS Arrow build. (#542, #551, #525, #581) - Misc Fixes: Fixed mismatched doc strings in
.pyistubs, clarified create path existence error, and fixed README examples to useQuery. (#529, #559, #558)
🔧 Refactoring & Cleanup
- API Cleanup: Removed
QueryParams::set_type()and clarified multi-query wording in docs. (#518, #590) - Code Quality: Enabled targeted
bugproneclang-tidy checks, ignored dirty submodule worktrees, and fixed typos in IVF searcher tests. (#500, #523, #526) - DiskANN I/O Decoupling: Replaced the separate DiskANN plugin
.soand hard build-time dependency onlibaio-devwith a thread-safe singleton thatdlopenslibaio.soat runtime and caches syscall pointers. Falls back to synchronouspread()with a warning when libaio is absent, simplifying the build and deployment story. (#532)
🤖 CI & Build Improvements
- Build Hardening: Declared and enforced 64-bit-only Python support. (#576)
- CI Scheduling: RISC-V build now runs weekly instead of per-PR. (#577)
- Dependency Bumps:
actions/cache5→6. (#537)
📝 Documentation
👋 New Contributors
Thanks to all first-time contributors in this release:
Full Changelog: v0.5.1...v0.6.0