π Zvec v0.8.0 Release Notes
Zvec v0.8.0 brings faster queries, lower index build costs, and broader platform support. Quantizer and distance-kernel improvements benefit multiple formats and metrics, with major gains for INT4 and Linux ARM64. This release also reduces peak memory during IVF/DiskANN builds, accelerates HNSW RaBitQ construction, and makes Chinese FTS ready to use with embedded Jieba resources. Platform coverage expands across desktop and mobile, alongside fixes for concurrent reads, index rebuilding, and filtering correctness.
β οΈ Breaking Changes and Upgrade Notes
- Jieba global dictionary configuration removed: Default dictionaries and the HMM model are now embedded in native libraries. Python users must remove
init(jieba_dict_dir=...)and calls toset_default_jieba_dict_dir()/get_default_jieba_dict_dir(). The corresponding C configuration accessors, C default-directory APIs, and C++ global configuration field and registration APIs have also been removed. To override the main dictionary, use the field'sFtsIndexParam.extra_params.jieba_dict_dirorZVEC_JIEBA_DICT_DIR; field configuration takes precedence. Useuser_dict_pathto add business vocabulary. (#807)
π¦ New Features
- Intel Mac and Windows ARM64 support: Added macOS x86_64 builds and Windows ARM64 support with MSVC. Release workflows now include Windows ARM64 SDK packages and native Python 3.11β3.14 wheels. (#713, #352, #824)
- DiskANN on Windows and mobile: Added asynchronous, unbuffered Windows reads through I/O completion ports and portable
preadsupport for Android and iOS. (#625, #656) - RaBitQ on Windows x86_64: Added Windows x86_64 support for RaBitQ indexes. (#780)
- Embedded Chinese FTS dictionary: Embedded the default Jieba dictionary and HMM model as LZ4-compressed resources for Python wheels and native SDKs. Parsed defaults are shared, while custom user dictionaries remain isolated between tokenizer instances. (#807)
- More flexible identifiers: Document IDs now accept valid UTF-8 up to 1,024 bytes, and collection names accept valid UTF-8 from 1 to 256 bytes, excluding prohibited control and separator characters. Field names retain their ASCII character set, expand to 64 bytes, and reject reserved internal names. (#756)
- Uniform quantization in collections: Added uniform UINT4 quantization and integrated uniform UINT4/UINT7/UINT8 quantizers with the database layer and HNSW. A shared quantization range avoids per-datapoint score reconstruction during queries, accelerating search. Using a shared min/max across all indexed points can increase quantization error and reduce recall. (#698, #754)
- Turbo PQ and FastScan: Added PQ-INT4 and a 4-bit PQ FastScan implementation with packed block scanning, together with SIMD and scalar distance kernels and precomputed residual distance tables for IVF. (#664)
- OPQ preprocessing: Added Optimized Product Quantization rotation to the Turbo framework and consolidated common training and serialization logic across PQ quantizers. (#717, #765)
- Shared page cache for vector indexes: Added buffer-backed storage and integrated HNSW, IVF, and DiskANN with a shared page cache. The implementation supports pinned reads, batched page access, and DiskANN direct-I/O fallback under cache pressure. (#708, #742, #766)
π Performance Improvements
- Lower IVF and DiskANN build memory: Reduced redundant vector copies, streamed merged inputs, bounded temporary encoding buffers, and released completed builders and inputs earlier to reduce peak memory during construction and optimize. (#733, #762)
- Faster HNSW RaBitQ construction: Reused raw vectors during neighbor pruning and batched Flat provider lookups and segment locking, reducing repeated reads and lock acquisitions. (#755, #813)
- Turbo distance calculation across index families: Migrated Flat, HNSW, IVF, and DiskANN distance calculation or quantization paths to Turbo and expanded AVX2, AVX512, AVX512-FP16, SSE, and ARM NEON kernels and runtime dispatch. This broad refactoring of quantizers and distance calculation improves performance across quantization formats and distance metrics, with substantial gains for INT4 kernels and Linux ARM workloads. (#716, #735, #773, #678, #687, #710, #689, #718)
- Vamana search improvements: Introduced a split contiguous packed layout, optimized candidate state and prefetching, and corrected medoid selection. Two-pass graph construction is now enabled by default to improve graph quality. (#701, #727, #738, #749, #761)
- Lower conversion and locking overhead: Batched document conversion, improved CRC32C and FP16 dispatch, and separated Flat query metadata access from segment-cache locking. (#647, #700, #825)
- Less refinement overhead: Optimized refinement kernels and candidate handoff/export;
Collection.query_internal_ids()reduces ID lookup overhead during refinement for read-only collections. HNSW and Vamana can now refine with FP16 or UINT8 vectors, withscale_factorcontrolling the candidate budget. (#677, #740, #748, #761, #821)
π Bug Fixes
- Concurrent reads and segment switching: Fixed crashes and missing rows when
fetch()orquery()races with a segment switch or flush, synchronized reads of writing segments, and corrected Flat cache synchronization and key-map iterator lifetimes. (#715, #722, #726, #779) - Index rebuild and training correctness: Preserved vector-to-row mappings when rebuilding indexes containing deleted rows, propagated IVF
n_iterscorrectly, decoded Turbo sources during merge training, and corrected INT4 scoring metadata to use rounded values. (#731, #730, #763, #777) - Optimize concurrency controls: Reused the optimize thread pool for builders and honored configured optimize concurrency in nested RaBitQ and DiskANN training. (#757, #775)
- SQL and filtered retrieval: Balanced deep OR expression trees, prevented overlapping prefix/suffix matches in
LIKE, fixed inverted-index suffix and empty-array queries, and enabled primary-key brute-force search for filtered IVF queries. (#694, #745, #752, #816) - Exact floating-point range bounds: Preserved FLOAT and DOUBLE bounds when converting an inverted-index condition into a forward filter, ensuring exclusive comparisons continue to exclude values equal to the bound. (#818)
- FTS persistence and recovery: Persisted sealed full-text postings before dropping side column families and hardened WAL recovery, schema handling, and decoding. (#759, #756)
- ARM FP16 dispatch: Fixed compile-time detection and runtime selection of ARM NEON FP16 kernels. (#723)
π§ Refactoring and Developer Tooling
- Storage read lifetimes: Migrated index storage reads to
MemoryBlock, extending lifetime-safe borrowed and batched access across index implementations. (#812) - SQL filter planning: Added extensible filter-set rewriting and separated filter validation from execution binding. (#690, #769)
- RaBitQ dependency updates: Upgraded RaBitQ-Library through v0.3.8 to v0.7.0 and adopted upstream modular core/FastScan targets. (#780, #814)
- Core tools and static analysis: Added Turbo quantizer support to core benchmark/build tools, introduced a clang-tidy pre-commit hook, and expanded modernization and identifier-naming checks. (#684, #571, #734, #751, #764)
π€ CI and Build Improvements
- Fixed conflicting MSVC debug flags, an MSVC ARM64 compiler crash in tests, unavailable legacy Android SDK tooling, and build warnings. Disabled unused Thrift OpenSSL support and stripped debug symbols from Android prebuilt SDK libraries. (#692, #795, #753, #720, #819, #702)
- Updated
actions/setup-python,actions/setup-java, andsoftprops/action-gh-release(#712, #750, #725)
π New Contributors
Thanks to all first-time contributors in this releaseοΌ
- @Aanerud made their first contribution in #352
- @Mordris made their first contribution in #571
- @JasonXuDeveloper made their first contribution in #795
- @smartworldarafath made their first contribution in #779
- @gouyt13 made their first contribution in #814
- @jak-pan made their first contribution in #818
Full Changelog: v0.7.0...v0.8.0