提交

323 次代码提交

作者 SHA1 备注 提交日期
egolearner 23a1ef815e fix: validate reformer/entity ex_bits consistency in HnswRabitqStreamer (#436)
When a RabitqReformer trained with one total_bits is reused for an entity
configured with a different total_bits, the quantized data layout (ex_code
size) silently mismatches. This causes get_full_est() to interpret binary
quantization codes as floating-point factors, producing garbage distances
that sporadically drop search results.

Add an ex_bits() accessor to RabitqReformer and validate it against the
entity's ex_bits in HnswRabitqStreamer::open(), returning IndexError_Mismatch
on inconsistency. Fix the HNSWRabitqGeneral test to re-create a converter
and reformer with matching total_bits=2 for the third invocation. Add
TestExBitsMismatch to verify the mismatch is correctly rejected.
2026-06-02 11:12:15 +08:00
egolearner 3e98314d7c feat(ci): speed up clang-tidy CI workflow (#438)
- Add `clang_tidy_deps` CMake target that only builds generated headers
  (protobuf, Arrow, glog, gflags, lz4) instead of full `zvec_db`
- Run clang-tidy in parallel via `xargs -P $(nproc)` with per-file logs
- Split actions/cache into restore/save to ensure cache is saved even
  when clang-tidy fails, without caching incomplete build artifacts
- Shallow-clone submodules with `--depth 1`
- Bump ccache size from 100M to 500M
- Add `--quiet` to suppress noisy clang-tidy summary lines
- Remove redundant concurrency block from reusable workflow

Performance comparison (3 runs, same repo):

| Step            | Before  | After (cold) | After (warm) |
|-----------------|---------|--------------|--------------|
| Submodule clone | 66s     | 49s          | 28s          |
| Build deps      | 70s     | 21s          | 0s (skipped) |
| Cache restore   | 1s      | 1s           | 12s          |
| Total           | 3m03s   | 2m34s        | 1m46s        |

Dominant win: reduced build target (~49s). Headers cache adds ~9s net.
`--depth 1` contributes ~15s (with network variance).
2026-06-02 10:28:05 +08:00
ZeFeng Yin 0807adeec5 fix(buffer_storage): vector block leak (#434) 2026-06-02 10:19:38 +08:00
ZeFeng Yin 8ce8e3e228 chore: rm buffer manager (#437) 2026-06-02 09:51:41 +08:00
Qinren Zhou 8e8bb81db0 refactor: tidy query APIs and execution (#431) 2026-06-01 21:07:35 +08:00
egolearner 02bfb31cf5 feat: add fts support (#408)
Add BM25-based full-text search with CJK (jieba) tokenization, supporting
  query_string and match_string syntax, phrase queries, boolean operators
  (AND/OR/NOT/MUST), and hybrid retrieval with existing vector search.

  ## Core
  - BitPacked posting format with block-max WAND pruning
  - Tokenizer pipeline: jieba (cut/cut_for_search/hmm/full), whitespace,
    lowercase, with extensible pipeline composition
  - Query parser: boolean operators, phrase queries, field scoping,
    boost, MUST(+) modifier inside OR (ES query_string semantics)
  - AST rewriter: dedup repeated terms with linear boost aggregation,
    flatten same-type composites, canonicalize OR-with-must_not into AND
    wrapper, empty-node propagation, contradiction detection
  - FTS reduce/merge integrated into Optimize compaction
  - Multi-segment score-descending sort
  - Auto-register bundled jieba dict on SDK import

  ## Performance
  - Block-max WAND with cached block_max_info_for (single binary search)
  - AVX2/SSE bitpacked encoding with cross-arch scalar fallback
  - MultiGet for batch posting retrieval and phrase position verification
  - HashSkipList memtable for posting writes
  - PinnableSlice zero-copy reads
  - Filter pushdown into composite iterators (Disjunction/Conjunction/Phrase)
  - Candidate-driven (brute-force) evaluation for selective invert filters
  - Precomputed BM25 IDF weights, cached SIMD dispatch pointers
  - Shortest-list anchor for phrase position matching
  - Single-open per-term posting iterator

  ## Query
  - Tokenize query terms through the same pipeline as indexing
  - EmptyNode for zero-token queries (all stop-words / punctuation)
  - Backslash unescape after lexing in query parser
  - Schema allows collections without vector fields (FTS-only use case)
  - Create/Drop Index validates supported index types
  - FTS fields disallowed in SQL filter expressions

  ## Bindings
  - C API: fts query params, brute-force ratio config
  - Python SDK: FTS search, jieba dict auto-registration

  ## Internals
  - Bypass cppjieba::Jieba to drop KeywordExtractor (~12MB fewer required files)
  - Hide tokenizer pipeline from public header (Pimpl-style FtsState)
  - ListColumnFamilies to avoid double-open on segment load
  - Reorganized fts_column into tokenizer/, posting/, iterator/ subdirs
2026-06-01 15:02:54 +08:00
ZeFeng Yin 74beb2a828 feat: buffer storage write (#414) 2026-06-01 10:40:49 +08:00
lichen2015 de8fb760ef fix: sync querier schema after column DDL to fix empty query fields (#429)
* fix: sync querier schema after column DDL to fix empty query fields (#426)

* fix: sync querier schema after create_index/drop_index
2026-05-29 17:36:30 +08:00
egolearner 8dcb6cbd7f refactor: drop VectorQuery, unify single-target query on SearchQuery (#428) 2026-05-29 16:36:09 +08:00
lichen2015 f539580138 feat: migrate multi-vector query and reranker logic to C++ (#405)
* feat: migrate multi-vector query and reranker logic to C++

- Add Reranker base class with RrfReRanker and WeightedReRanker implementations
- Add Collection::MultiQuery interface for multi-vector queries with reranking
- Add MultiVectorQuery struct in doc.h with forward declaration for Reranker
- Add C API bindings for reranker and MultiQuery (zvec_reranker_*, zvec_multi_vector_query_*, zvec_collection_multi_query)
- Add Python binding for reranker classes with py::function bridge for callback
- Validate duplicate field names in multi-vector queries (C++ and Python consistent)
- Remove TODO comment about concurrent execution (SQLEngine is not thread-safe)
- Update collection.h MultiQuery doc comment from concurrently to sequentially
- Add C++ collection tests (6 MultiQuery test cases)
- Add C API tests (reranker functions + multi_vector_query end-to-end)
- Implement Python test cases (11 previously skipped tests now active)
- Simplify Python query_executor validation for unified duplicate field check

* style: format Python files with ruff

* fix: adapt to main branch API changes (VectorQuery->Query rename, validate_and_sanitize)

* fix: multi_vector tests now use multiple same-type vector fields (dense2, sparse2)

* fix: suppress RET501 for intentional default return None in RerankFunction._get_object

* style: ruff format test_collection.py

* refact multi vector query

* format code

* fix(multi-vector): expose SubVectorQuery in Python binding, fix tests

- Register _SubVectorQuery in pybind11 with from_vector_query() factory
- Convert _VectorQuery to _SubVectorQuery in MultiVectorQueryExecutor
- Relax RRF/Weighted score assertion tolerance from 1e-10 to 1e-6
- Fix WeightedReRanker test metric to IP (matching HnswIndexParam default)

* style: ruff format query_executor.py

* fix: define _USE_MATH_DEFINES for M_PI on Windows (MSVC)

* refactor: include reranker.h directly in query.h instead of forward declaration

* refactor(reranker): move topn from member variable to rerank() parameter

* refact code

* style(python): fix ruff UP035/UP037 in multi_vector_reranker

- import Callable from collections.abc instead of typing (UP035)
- remove redundant quotes around MetricType annotations (UP037)

* chore: trigger PR sync

* refact code

* fix(examples): restore CMakeLists.txt formatting broken by clang-format

* refactor(reranker): remove redundant metrics_ map by querying schema directly, and use insert return value to avoid duplicate set lookup

* refactor(reranker): defer schema binding to query time and remove C API callback reranker
2026-05-29 10:10:41 +08:00
lichen2015 e0ba23179b feat: fetch() add output_fields param (#358) 2026-05-27 22:58:49 +08:00
egolearner f336c5c955 fix: train rabitq converter in compact-path ReduceVectorIndex (#425)
Extract the shared train+attach logic into
SegmentHelper::PrepareQuantizeField, used by both
SegmentImpl::create_vector_index and SegmentHelper::ReduceVectorIndex.
2026-05-27 12:06:21 +08:00
Qinren Zhou e6c10f96be minor: rewrite repeated optimize unit tests to cover more indexes (#423) 2026-05-26 18:51:09 +08:00
ZeFeng Yin 0cb2d8830e feat: small block(4K) read for 2M chunk size (#406) 2026-05-26 11:27:06 +08:00
ZeFeng Yin d9b0920ac7 fix: ivf provider sorted by local id (#422) 2026-05-26 10:33:44 +08:00
lichen2015 bdf58fc2d2 fix: prevent SIGABRT when adding nullable column to multi-segment collection (#415) (#416)
When add_column is called on a multi-segment collection with a nullable
field and no expression, segment.cc previously sliced an Arrow ChunkedArray
with an offset that exceeded the array length, triggering SIGABRT in
Arrow's chunked_array.cc:170 assertion.

Fix the slicing logic in segment.cc to materialize null values per segment.
Add comprehensive tests in collection_test.cc and segment_test.cc covering
multi-segment add_column scenarios (nullable/non-nullable, with/without
expression, with/without unflushed data, drop+re-add).
2026-05-24 14:13:57 +08:00
Qinren Zhou d351637da8 fix: optimize allocated wrong names for vector index (#421) 2026-05-23 11:15:22 +08:00
egolearner 9aae7494ad chore: enable modernize-use-override and fix existing violations (#419)
Add modernize-use-override to .clang-tidy and apply fixes across
src/ and tests/: replace redundant virtual with override, annotate
missing override on derived methods, and drop redundant virtual on
already-overridden methods.
2026-05-21 19:05:32 +08:00
ZeFeng Yin bae0e1b763 chore: fix nightly coverage run-error (#417) 2026-05-21 11:47:49 +08:00
egolearner 9bfc4b556a chore: fix more warnings (#418) 2026-05-21 11:15:41 +08:00
egolearner 51c6d9e0ec chore(thirdparty): mark third-party include paths as SYSTEM (#413)
Add SYSTEM to target_include_directories in vendored CMake wrappers and
set INTERFACE_SYSTEM_INCLUDE_DIRECTORIES on imported / sub-project
targets so warnings from third-party headers no longer surface in our
build output. Introduces a mark_target_includes_system() helper in
cmake/utils.cmake (resolves aliases, skips missing targets) used by the
upstream-add_subdirectory wrappers (glog, gflags, googletest, yaml-cpp,
protobuf, antlr).
2026-05-19 15:03:07 +08:00
Jason d580c08187 fix: correct format specifiers for uint64_t types (#374)
Signed-off-by: syaojun <libevent@yeah.net>
Co-authored-by: rayx <rui.xing@alibaba-inc.com>
2026-05-19 13:45:32 +08:00
feihongxu0824 18b79586a7 ci: skip timing-sensitive GIL test in coverage builds (#412)
The COVERAGE build type uses -O0 and gcov instrumentation, which slows
C++ query execution ~5-10x. This causes test_gil_released_during_query
to exceed its 0.5s timing threshold and fail with an inconclusive result.
2026-05-19 10:45:42 +08:00
feihongxu0824 a9008b0fd2 fix: nullable scalar field filter leaks null documents without inverted index (#410)
When a nullable scalar field has no inverted index, the forward filter path
fails to handle null values from Arrow's filter evaluation:

1. get_forward_bit(): BooleanArray::operator[] returns nullopt for null entries,
   which is_filtered() treats as "no filter" (not filtered), letting null docs
   through. Fix: use value_or(false) to treat null as "not matched".

2. is_matched_by_forward_filter(): reads BooleanScalar.value without checking
   is_valid, which is UB for null scalars. Fix: check is_valid first.

Closes #409

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-18 20:25:06 +08:00
rayx 3e02031eb8 refactor: remove hamming metric (#365)
* refactor: remove binary metric

* fix: fix windows
2026-05-18 19:31:20 +08:00
feihongxu0824 273ffc2ad8 enhance: release gil lock in collection bindings (#363) 2026-05-14 10:15:49 +08:00
Qinren Zhou e8eaf0aa57 fix: python ut (#401) 2026-05-13 15:56:58 +08:00
Qinren Zhou e0b8331116 minor: revise error messages (#400) 2026-05-13 13:18:54 +08:00
egolearner a29b9b366c chore: clang-tidy check fast quits if no cpp files changed (#396) 2026-05-13 10:03:26 +08:00
Cuiys 42958caef5 feat(test): enable parallel tests (#384)
- Set unique WORKING_DIRECTORY per test binary via cc_test()/cuda_test() to prevent filesystem path conflicts when running tests in parallel. Each test runs in ${CMAKE_BINARY_DIR}/test_tmp/${test_name}/.

- Enable parallel ctest execution in the unittest target with ProcessorCount-based --parallel flag (defaults to NPROC - 1).

- Set TEST_BINARY_DIR environment variable for crash recovery tests so they can locate helper binaries from isolated working directories.

- Update LocateDataGenerator() and LocateOptimizeGenerator() to search TEST_BINARY_DIR and TEST_BINARY_DIR/bin for helper executables.
2026-05-12 23:14:17 +08:00
egolearner d0489da401 ut: fix some uts (#394) 2026-05-12 19:04:33 +08:00
Cuiys d91867e00e ci: add ccache/sccache compilation caching to speed up CI builds (#360)
* ci: add ccache/sccache compilation caching to speed up CI builds

- Use hendrikmuhs/ccache-action@v1.2 for Linux/macOS/iOS/Android/clang-tidy
  (auto-installs ccache, manages cache, sets env vars, shows stats)
- Use mozilla-actions/sccache-action@v0.0.9 for Windows (MSVC compatible)
- Add CMAKE_C/CXX_COMPILER_LAUNCHER to all CMake build steps
- Exclude wheel build and nightly coverage workflows per decision

* ci: switch MacOS & Linux build from Unix Makefiles to Ninja generator

- Replace CMAKE_GENERATOR='Unix Makefiles' with 'Ninja' in pip build
- Replace 'make unittest -j' with 'cmake --build --target unittest --parallel'
- Add '-G Ninja' to C++ and C example cmake configure steps
- Replace 'make -j' with 'cmake --build --parallel' for examples
- Aligns with Windows and Android workflows which already use Ninja

* ci: enable parallel ctest execution with -j and --timeout

- Use CMake ProcessorCount module to detect available CPU cores
- Add -j ${NPROC} to ctest command for parallel test execution
- Add --timeout 300 to prevent individual tests from hanging CI
- Fallback to NPROC=1 when ProcessorCount returns 0
- iOS target unchanged (build-only, no test execution)

* Revert "ci: enable parallel ctest execution with -j and --timeout"

This reverts commit d196dac5f17b1f7cae443360c88bbd8c935dc145.

* fix(ci): remove sccache from Windows, fix cmake.define quote issues

Windows (05-windows-build.yml):
- Remove mozilla-actions/sccache-action: sccache incompatible with MSVC /FS flag
- Remove SCCACHE_GHA_ENABLED env var
- Remove CMAKE_C/CXX_COMPILER_LAUNCHER=sccache from build steps
- Remove 'Show sccache statistics' step
- MSVC /FS (global PDB concurrency flag) causes fatal C1041 when used with sccache

MacOS & Linux (03-macos-linux-build.yml):
- Fix cmake.define values: remove extra quotes around 'ccache' and 'ON'
- Bare values required: cmake.define.FOO=bar not cmake.define.FOO="bar"

* feat: cache key with platform and os

* ci: add compiler to ccache key to avoid cache pollution

* ci: optimize cache usage to reduce bloat

- Add max-size limits to all ccache configs (150M general, 300M Android,
  100M clang-tidy) to prevent unbounded cache growth
- Remove redundant iOS full build directory cache (~1.2 GB) since ccache
  already handles incremental compilation
- Fix iOS protoc cache key to use thirdparty/protobuf/** instead of
  src/**, avoiding unnecessary cache misses on business code changes

* ci: trigger CI run
2026-05-12 15:48:48 +08:00
egolearner ce468af29b deprecate python VectorQuery (#267)
* deprecate python VectorQuery

* remove import
2026-05-12 14:55:49 +08:00
luoxiaojian 269c611f78 build(thirdparty): replace CRoaring submodule with amalgamation (~292M -> ~1MB) (#381) 2026-05-12 14:55:08 +08:00
ZeFeng Yin ee40e5e0b7 fix hnsw context fetch (#386) 2026-05-11 11:17:40 +08:00
ZeFeng Yin 3b0921b0e1 minor: update readme for v0.4.0 (#389) 2026-05-09 11:40:30 +08:00
Qinren Zhou cfe9eed2f8 minor: remove unused validation in c api (#388) v0.4.0 2026-05-08 19:04:45 +08:00
Jalin Wang 1d4ae0b1b5 refactor: support UTF-8 file paths via std::filesystem (#359)
Rewrite file/path handling to use std::filesystem and UTF-8-safe helpers.
Switch Windows file open/create paths to wide-char APIs, replace manual
separator concatenation with PathJoin, and enable RocksDB UTF-8 filenames.

Also add UTF-8 path coverage for file IO, version manager recovery, and
collection open/flush/reopen flows.
2026-05-08 17:44:22 +08:00
Qinren Zhou 68a497efdb fix: sparse vector indices should be ordered (#382) 2026-05-07 16:40:49 +08:00
ZeFeng Yin d02ae2b74e fix: rollback hnsw ChunkSize to 2M (#383) 2026-05-07 11:00:00 +08:00
luoxiaojian efab064676 feat: refac entity and impl Vamana. (#371) 2026-04-30 10:22:25 +08:00
ZeFeng Yin 005680522b feat: merge vector arrow buffer (#320) 2026-04-29 19:24:50 +08:00
ZeFeng Yin 07e986d3d5 fix: hnsw chunk size init (#372) 2026-04-29 10:50:16 +08:00
ZeFeng Yin 06e2845069 fix hnsw_streamer_test (#375) 2026-04-28 19:12:32 +08:00
feihongxu0824 8884b2de5b minor: update wechat qrcode in cn readme 2026-04-24 10:51:04 +08:00
feihongxu0824 d55aa74c4c minor: update readme wechat qrcode 2026-04-24 10:37:02 +08:00
Qinren Zhou 4e7fa0f37f fix: some minor bugs (#370) 2026-04-23 16:24:59 +08:00
egolearner 2b16ed39cd chore: rm hnsw-rabitq searcher/streamer (#367)
* chore: rm hnsw-rabitq searcher/streamer

* fix clang-tidy

* fix
2026-04-23 10:20:46 +08:00
feihongxu0824 d9cf689ce1 ci: disable benchmark ci temp (#362) 2026-04-21 14:39:25 +08:00
Qinren Zhou ad1411b7bc minor: update readme (#361) 2026-04-21 12:33:20 +08:00