v0.4.0
Milvus-compatible collection engine
The Python document/collection layer was replaced by a native C++ CollectionStore (src/server/collection_store.{h,cpp}). It owns schema metadata, scalar encoding, filter compilation, the SSD-backed graph index, and a RocksDB-backed (id, tag, document) doc store. The same engine backs both Milvus-compatible entry points:
- In-process
MilvusClient(pipeann/milvus.py) is a thin row/column shim overCollectionStore; its URI is a local directory. - C++ gRPC server (
src/server/milvus_server.cpp) speaks the Milvus wire protocol, so stock Milvus SDKs can connect without PipeANN-specific client code.
New
CollectionStoreC++ engine and itspipeann.C.CollectionStorepybind binding (src/python/pycollection.cpp).- Milvus-style collection CRUD, insert/upsert, search, scalar query, get, delete, count, flush, index creation, and load/release stubs through
MilvusClientand the gRPC server. - Native SQL-like filter strings for
search(filter=...),query(filter=...),delete(filter=...), andcount(filter=...). Supported syntax includes comparisons,in/not in,between,like,array_contains,array_contains_all,array_contains_any,and,or,not, and parentheses. - Scalar field encoding for
VARCHAR, integer, boolean, float/double, and integer-array fields. Float/double filter literals are rewritten to the order-preserving integer encoding used by range indexes. StringPrefixSelector,StringSuffixSelector, andStringLikeSelectorforLIKEfiltering, alongsideStringEqSelector.field_codec.hscalar encode/decode coverage intests/test_field_codec.cpp, Milvus quickstart coverage intests_py/test_milvus_quickstart.py, and gRPC end-to-end coverage intests_py/test_grpc_server_e2e.py.pipeann-server/python -m pipeann.serverlauncher for the bundledpipeann_milvus_serverbinary.
Low-level filter config
pipeann::dsl::compile(sql, schema)now accepts the same SQL-like expression string used by the Milvus layer.pipeann::dsl::CompiledFilterreturns the selector, literal attribute template,slot_map, andvar_field_type. Literal filters are ready to search immediately.$$varplaceholders remain available for C++ benchmark and low-levelIndexPipeANNworkflows.bind_rowandbind_batch_per_varfill those slots, including.spmatbatch binding.DynamicIndex::load_filter_from_json(config_path)andIndexPipeANN.load_filter_from_json(config_path)consume{attr_indexes, filter, bindings}wherefilteris a SQL-like expression string, then return oneAttributesrow per bound query.
Breaking
- Removed the PipeANN-specific Python
Client(pipeann/client.py) andCollection(pipeann/collection.py). UseMilvusClientin-process or any Milvus SDK against the gRPC server. - Removed the SQLite-backed Python document/metadata layer. Collection metadata and documents now live in the native engine and RocksDB doc store.
- Removed the LangChain (
PipeANNVectorStore) and Qdrant FastAPI integrations that depended on the deletedCollectionlayer. Collection.compile_filter,Collection.hybrid_query, and
Collection.filter_queryno longer exists. UseMilvusClient.search/MilvusClient.querywith a SQL-likefilter=string, or low-levelIndexPipeANNselectors for direct index workflows.- Removed
parse_selector_from_jsonandload_selector_from_config(include/filter/selector.h) andpipeann::load_base_attr_from_config(include/filter/attribute.h). Useload_filter_from_jsonwith the{attr_indexes, filter, bindings}config. - The legacy
{"base": ..., "query": {...}}filtered-search config no longer loads;scripts/attr_config/*.json,tests/search_disk_index_filtered.cpp, andtests/utils/compute_groundtruth.cppuse the new config schema.