nidx-binding 6.9.1.post600__tar.gz → 6.9.1.post616__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/PKG-INFO +1 -1
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_protos/nidx.proto +15 -1
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_protos/nodewriter.proto +1 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_protos/pyproject.toml +1 -1
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_protos/src/lib.rs +1 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/data_store/v1.rs +1 -1
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/data_store/v2/paragraph_store.rs +1 -1
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/data_store/v2/quant_vector_store.rs +7 -3
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/data_store/v2/vector_store.rs +1 -1
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/data_store.rs +1 -1
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/hnsw/ops_hnsw.rs +49 -35
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/hnsw/params.rs +4 -1
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/hnsw.rs +1 -1
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/inverted_index/fst_index.rs +10 -5
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/inverted_index/map.rs +9 -4
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/inverted_index.rs +11 -4
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/segment.rs +26 -10
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/pyproject.toml +1 -1
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/api/grpc.rs +6 -2
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.config/nextest.toml +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-0cfce9b29547f8f5bafa6e440f86103be7b8c4ad2fd92db9ac223f4efbe23d10.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-1a561eed00f3dbe868bf5030059793300209179dc8fb73e4b57a54b5e81262fe.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-1d3fca2682e25a01143da92285297f134a6a105a96f64d87e0db3abb219855e4.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-249b3b57c27a71baa823f1fe0f0bba9c9af36f61c28f731e58beea60ec48e687.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-24cb6b683daa42d7125f862e25943ab4be7bf275cd8739f8da4859d701795e1a.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-263c8fce6db5b03bbd012fafdba6943cbee6ed7eb8976cdef4f5b01dde7ca6fd.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-2a5d92fb1638df830a4477a7cdf24e6db6b43034b7bbe74fdfb63e8afe2c4071.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-2b065a363f58caed60e3706603c1260dbf5a4c795604a5b68edda22eb07fec1b.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-3fc3cb39934683de8cd475ce1368c8373453eb1e01f81587d66b9d14b109ce6e.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-48f33b77b7c1633467b0b2efcaa1d3c207e7757e4f1d83b40d15e6ca365f7771.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-4ae09f2c08e2f324bee01bb8487a8f37678a1c5e9d327339235c50d4921a8949.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-4d7a76fa413c9ef0ce2a47ac7bb7e01d3e6a2aabded9487d21010a53efee8852.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-4fcbdd6657c7dc9b60b3a563dd41711b3dbcf72ce063427b7a01f8cddf34c244.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-577109ac00ccfbd38ecaccab94116f2f46a4caf5612afa372cded197123c1e08.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-5db25f97d8578d6d78f2f6bd4b72cc82a9b1b82805c6422d967ac63b20d99db4.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-5ec3233a3a23e926055056d46bdde17836a633066dbb5f349502648cd3ea9a60.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-66edb6ea424d8681927dcddb6bac5f1239175f4775d1f40417ba15054b0c6f19.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-6f9c6d201c1b5712efb68c363bffd3e0169c11f2a8f925e8cd4e8808599ff7b4.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-733c3ebacc86f444bf5e2dd79ade660c291e88a00fc09b722f6e2e191545874c.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-7a3bf27c330c468a596e8a297cf7d8b192e31e67ecc5177c1267f579e8e247c7.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-7a7e59e47b30b12237511fd3d7da2d17b0471ad2b006af48d6a6f587c779692b.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-7dcbb33312cc9f11ae3a6d73b1ace017a9f19a8bf8f10304fc57977c8efeadff.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-7efa7c0d747afc4b6aed0586ff846c27839c3213ff7ee9f30c89b0d0f17e60e3.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-8493140d788604d498a4e48da4158708572ccc9d60185290a00d549cc84533db.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-8493bb0059b013eaca42fd10cd7d04f0d06a8acaed379eff0d23f3229edde9ee.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-87996b3d6c7a2195438d7038015b06949102bce8c7b8cd8db1f83aaf23cbe489.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-8d33717587c6ee8f5fc339a80b1212a73d6c03e45856b1d55457fc8074709dd0.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-8f096d8171b89f9615d18f95d696dc9e4fb3674e103161a713cdc806f7a68506.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-917732a56ee04bf3a6e127319dda8225210869c82f9828d878162394dba4e078.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-95fe4ef93ee90733db1b67ed7987f80b5aac792f1590b979c68b418d1599eb98.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-9b67658569b343d8b4b61ae0a7dc721f367f2ba33c7b69b9e68bfd5c9bff5206.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-9c8062ea55d070afef68309e58fa987eb37fda44e1efbf68c8ba2af7846cc968.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-a06e1d9f6f95e4c4c2b98310ebddcc9d963cc033582bf2e945e8bf3a301b4247.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-a55265c9b07bd1399961a6f1e757201fd0eebe868ddaf96437111113d80fce92.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-a60ec2f66f1e7b84189e5b089f2087a29ff6a64326a3743dea935bbc58ee77fa.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-a891a37be5c2d7cce775c2dd33726b0318fd3839beab222a1b22bc6174604207.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-a945191bb4b3e37d6823ed3ad499339d007d69983105de8567777d9daf517b28.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-abe9f7832f2bd799ac44008da031e8d8ab52d4f5fbfc2a7e3974e8873bae55b2.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-aca588cca57a85e4d7fcc40c23cd87e57d53d11ca550d78e7e3d5e39e524fcd3.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-b02f8aafc00a7724510772ac41269e368c5bccf03ef7b4590e0ef6fd1a1bf64f.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-b742e17cabe2d64617e9aa64bafc782172f7a4f8023d1b54f952a0fb39f6b2b8.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-b94e349dbc0daec57f8f8f6e9e2dffb06100b1bb2b41d297c9f3b191da37a83d.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-bd9afa22994aba671dbf7b5f89b53c2ee02f53c0442a81265786a6d52d08512f.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-be60554eca98a5899efc6b49785cecd6444a6d39afed9e4a884ce2dbf162012c.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-bf49702b506c9a1650ece1f8e8d9f14834a902f8caefafe30ded55e2790f2188.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-bfcd21ed704cd305db5c17fcdec7d92aa4ac501913c9c9514d8ff92928c0c7e7.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-c3ab694650f49a75b146fb877a92e48c4f20f0d99f70f8ec859fbb763b01a1e5.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-c55542bb9fae544d87fae6f30e0fe8a9088d12075f4442ab4fe2fcd05e472234.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-cb29a6556d35ac630ee0aa885dd7341cf9573bd3efd216ff8a887b87686b03db.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-d0a1f341a89f5f14696b10baa72db9d95551c2b7e5fc67308fd52dc03dd98a92.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-d2ad0a0ca2649c9e4873cfcc1fc66d2d07cc45d0f65c560b06d7b5f592f4fa8a.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-d6cfe78eb635ba0b89ca4021a4dc8182d18ab5b197f30149cd28488eba4c1df5.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-d729b56dea00e49dcdba8cf0001e2811da27351eabe98212db3b589f18fc6f32.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-d9658bfd4e7170b41d03f2ddf2446d0bf54171c0d39d53bf20af2b8437f2ec48.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-dbba7b3d3289425bae711aedbf73fbc3699f857f86f84d95c3b556d05c5658b0.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-dcb96b649d6d63a58efd5d445453a4f3d7869a56ff714b69bedf3d616a0473ca.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-ebd876fbf5362a5900e75bc05f2f11c73c406ef7da4e95097fc6a1c3d1b8bc54.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-eef5cc6bce1cc14eba8f3e68971724ef181e88cffcedd74673615f2026b89a62.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-ef56d5fefc5774040d1ee397beadb475f6af02768c22f0e583c74062e2e821ce.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/Cargo.lock +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/Cargo.toml +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/README.md +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/migrations/20241007163501_initial.sql +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/migrations/20241211120039_merge_job_priority.sql +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/migrations/20241211121159_basic_indexes.sql +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/migrations/20241212151105_check_segment_records.sql +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/migrations/20250110145554_in_flight_messages.sql +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_binding/Cargo.toml +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_binding/src/lib.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/Cargo.toml +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/src/fuzzy_query.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/src/lib.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/src/query_io.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/src/query_parser/fuzzy_parser.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/src/query_parser/keyword_parser.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/src/query_parser/stop_words.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/src/query_parser/tokenizer.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/src/query_parser.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/src/reader.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/src/request_types.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/src/resource_indexer.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/src/schema.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/src/search_query.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/src/search_response.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/src/set_query.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/README.md +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/ar.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/az.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/bn.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/ca.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/ch.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/da.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/de.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/el.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/en.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/es.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/eu.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/extract.py +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/fi.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/fr.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/he.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/hu.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/id.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/it.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/kk.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/ne.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/nl.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/no.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/pt.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/ro.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/ru.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/sl.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/sv.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/tg.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/tr.json +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/tests/common/mod.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/tests/reader.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_protos/Cargo.toml +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_protos/build.py +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_protos/build.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_protos/nodereader.proto +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_protos/noderesources.proto +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_relation/Cargo.toml +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_relation/src/graph_collector.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_relation/src/graph_query_parser.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_relation/src/io_maps.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_relation/src/lib.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_relation/src/reader.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_relation/src/resource_indexer.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_relation/src/schema.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_relation/src/top_unique_n.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_relation/tests/common/mod.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_relation/tests/test_graph_query_parser_search.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_relation/tests/test_graph_search.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_relation/tests/test_writer.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_tantivy/Cargo.toml +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_tantivy/src/index_reader.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_tantivy/src/lib.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_tantivy/src/utils.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_tests/Cargo.toml +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_tests/src/graph.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_tests/src/lib.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_text/Cargo.toml +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_text/src/lib.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_text/src/prefilter.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_text/src/query_io.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_text/src/reader.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_text/src/request_types.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_text/src/resource_indexer.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_text/src/schema.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_text/src/search_query.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_text/tests/common/mod.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_text/tests/test_deletions.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_text/tests/test_flow.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_text/tests/test_search.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_text/tests/test_streaming.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_types/Cargo.toml +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_types/src/lib.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_types/src/prefilter.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_types/src/query_language.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/Cargo.toml +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/config.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/data_store/v1/node.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/data_store/v1/store.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/data_store/v1/trie.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/data_store/v1/trie_ram.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/data_store/v2.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/data_types.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/formula.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/hnsw/disk_hnsw.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/hnsw/ram_hnsw.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/indexer.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/lib.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/multivector.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/query_io.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/request_types.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/searcher.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/segment/tests.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/utils.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/vector_types/dense_f32.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/vector_types/mod.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/vector_types/rabitq.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/tests/common/mod.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/tests/test_basic_search.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/tests/test_hidden.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/tests/test_maxsim.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/api/shards.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/api.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/control.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/errors.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/grpc_server.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/import_export.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/indexer.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/lib.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/main.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/metadata/deletion.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/metadata/index.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/metadata/index_request.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/metadata/merge_job.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/metadata/segment.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/metadata/shard.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/metadata.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/metrics.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/scheduler/audit_task.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/scheduler/log_merge.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/scheduler/merge_task.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/scheduler/metrics_task.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/scheduler/purge_tasks.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/scheduler/vector_merge.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/scheduler.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/searcher/grpc.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/searcher/index_cache.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/searcher/query_language.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/searcher/query_planner.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/searcher/shard_search.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/searcher/shard_selector.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/searcher/shard_suggest.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/searcher/streams.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/searcher/sync.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/searcher.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/segment_store.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/settings.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/telemetry/duration_layer.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/telemetry/log_format.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/telemetry/middleware.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/telemetry.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/tool.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/utilization_tracker.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/worker.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/tests/common/mod.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/tests/common/services.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/tests/test_date_range_search.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/tests/test_search_filtering.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/tests/test_search_relations.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/tests/test_search_sorting.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/tests/test_searcher_cluster.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/tests/test_security_search.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/tests/test_shards.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/tests/test_shards_api.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/tests/test_suggest.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/tests/test_synced_searcher.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/tests/test_vector_normalization.rs +0 -0
- {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/tests/test_vectorsets.rs +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: nidx_binding
|
|
3
|
-
Version: 6.9.1.
|
|
3
|
+
Version: 6.9.1.post616
|
|
4
4
|
Classifier: Programming Language :: Rust
|
|
5
5
|
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
6
6
|
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
|
@@ -7,10 +7,10 @@ import "nidx_protos/nodewriter.proto";
|
|
|
7
7
|
|
|
8
8
|
service NidxApi {
|
|
9
9
|
rpc GetShard(nodereader.GetShardRequest) returns (noderesources.Shard) {}
|
|
10
|
-
|
|
11
10
|
rpc NewShard(nodewriter.NewShardRequest) returns (noderesources.ShardCreated) {}
|
|
12
11
|
rpc DeleteShard(noderesources.ShardId) returns (noderesources.ShardId) {}
|
|
13
12
|
rpc ListShards(noderesources.EmptyQuery) returns (noderesources.ShardIds) {}
|
|
13
|
+
rpc ConfigureShards(ShardsConfig) returns (noderesources.EmptyQuery) {}
|
|
14
14
|
|
|
15
15
|
rpc AddVectorSet(nodewriter.NewVectorSetRequest) returns (nodewriter.OpStatus) {}
|
|
16
16
|
rpc RemoveVectorSet(noderesources.VectorSetID) returns (nodewriter.OpStatus) {}
|
|
@@ -43,3 +43,17 @@ message Notification {
|
|
|
43
43
|
}
|
|
44
44
|
Action action = 6;
|
|
45
45
|
}
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
message ShardsConfig {
|
|
49
|
+
repeated ShardConfig configs = 1;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
message ShardConfig {
|
|
53
|
+
string shard_id = 1;
|
|
54
|
+
|
|
55
|
+
// Pre-warm is a feature to minimize cold starts on searches. It'll keep
|
|
56
|
+
// disk data in memory to avoid IO latency, at expenses of RAM usage. Use
|
|
57
|
+
// with care.
|
|
58
|
+
bool prewarm_enabled = 2;
|
|
59
|
+
}
|
|
@@ -10,7 +10,7 @@ build-backend = "pdm.backend"
|
|
|
10
10
|
|
|
11
11
|
[project]
|
|
12
12
|
name = "nidx_protos"
|
|
13
|
-
version = "6.9.1.
|
|
13
|
+
version = "6.9.1.post616"
|
|
14
14
|
license = "AGPL-3.0-or-later"
|
|
15
15
|
description = "Protobuf definitions for nucliadb/nidx"
|
|
16
16
|
authors = [{ name = "Nuclia", email = "nucliadb@nuclia.com" }]
|
|
@@ -98,7 +98,7 @@ impl DataStoreV1 {
|
|
|
98
98
|
{
|
|
99
99
|
let advice = match reason {
|
|
100
100
|
OpenReason::Create => memmap2::Advice::Sequential,
|
|
101
|
-
OpenReason::Search => memmap2::Advice::Random,
|
|
101
|
+
OpenReason::Search { .. } => memmap2::Advice::Random,
|
|
102
102
|
};
|
|
103
103
|
nodes.advise(advice)?;
|
|
104
104
|
}
|
|
@@ -90,7 +90,7 @@ impl ParagraphStore {
|
|
|
90
90
|
pos.advise(memmap2::Advice::WillNeed)?;
|
|
91
91
|
let advice = match reason {
|
|
92
92
|
OpenReason::Create => memmap2::Advice::Sequential,
|
|
93
|
-
OpenReason::Search => memmap2::Advice::Random,
|
|
93
|
+
OpenReason::Search { .. } => memmap2::Advice::Random,
|
|
94
94
|
};
|
|
95
95
|
data.advise(advice)?;
|
|
96
96
|
}
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
//
|
|
20
20
|
|
|
21
21
|
use lazy_static::lazy_static;
|
|
22
|
-
use memmap2::Mmap;
|
|
22
|
+
use memmap2::{Mmap, MmapOptions};
|
|
23
23
|
use std::{
|
|
24
24
|
fs::File,
|
|
25
25
|
io::{BufWriter, Write as _},
|
|
@@ -41,13 +41,17 @@ pub struct QuantVectorStore {
|
|
|
41
41
|
|
|
42
42
|
impl QuantVectorStore {
|
|
43
43
|
pub fn open(path: &Path, vector_len_bytes: usize, reason: &OpenReason) -> std::io::Result<Self> {
|
|
44
|
-
let
|
|
44
|
+
let mut options = MmapOptions::new();
|
|
45
|
+
if matches!(reason, OpenReason::Search { prewarm: true }) {
|
|
46
|
+
options.populate();
|
|
47
|
+
}
|
|
48
|
+
let data = unsafe { options.map(&File::open(path.join(FILENAME))?)? };
|
|
45
49
|
|
|
46
50
|
#[cfg(not(target_os = "windows"))]
|
|
47
51
|
{
|
|
48
52
|
let advice = match reason {
|
|
49
53
|
OpenReason::Create => memmap2::Advice::Sequential,
|
|
50
|
-
OpenReason::Search => memmap2::Advice::Random,
|
|
54
|
+
OpenReason::Search { .. } => memmap2::Advice::Random,
|
|
51
55
|
};
|
|
52
56
|
data.advise(advice)?;
|
|
53
57
|
}
|
|
@@ -29,6 +29,8 @@ use std::collections::{BinaryHeap, HashMap, HashSet, VecDeque};
|
|
|
29
29
|
use std::time::Instant;
|
|
30
30
|
use tracing::trace;
|
|
31
31
|
|
|
32
|
+
use crate::config::{VectorCardinality, VectorConfig};
|
|
33
|
+
use crate::hnsw::params::EF_SEARCH;
|
|
32
34
|
use crate::inverted_index::FilterBitSet;
|
|
33
35
|
use crate::vector_types::rabitq;
|
|
34
36
|
use crate::{ParagraphAddr, VectorAddr};
|
|
@@ -136,31 +138,48 @@ impl PartialOrd for CnxWithBound {
|
|
|
136
138
|
pub type Neighbours = Vec<(VectorAddr, f32)>;
|
|
137
139
|
|
|
138
140
|
/// Guides an algorithm to the valid nodes.
|
|
139
|
-
struct NodeFilter<'a
|
|
140
|
-
retriever: &'a DR,
|
|
141
|
+
pub struct NodeFilter<'a> {
|
|
141
142
|
filter: &'a FilterBitSet,
|
|
142
|
-
paragraphs: FxHashSet<ParagraphAddr
|
|
143
|
+
paragraphs: Option<FxHashSet<ParagraphAddr>>,
|
|
143
144
|
vec_counter: RepCounter<'a>,
|
|
144
145
|
}
|
|
145
146
|
|
|
146
|
-
impl<
|
|
147
|
-
pub fn
|
|
148
|
-
|
|
147
|
+
impl<'a> NodeFilter<'a> {
|
|
148
|
+
pub fn new(filter: &'a FilterBitSet, with_duplicates: bool, config: &VectorConfig) -> NodeFilter<'a> {
|
|
149
|
+
let paragraphs = matches!(config.vector_cardinality, VectorCardinality::Multi).then_some(Default::default());
|
|
150
|
+
let vec_counter = RepCounter::new(!with_duplicates);
|
|
151
|
+
NodeFilter {
|
|
152
|
+
filter,
|
|
153
|
+
paragraphs,
|
|
154
|
+
vec_counter,
|
|
155
|
+
}
|
|
149
156
|
}
|
|
150
157
|
|
|
151
|
-
pub fn
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
&& !self.paragraphs.contains(&self.retriever.paragraph(n))
|
|
155
|
-
// Reject the candidate if we already have a result with an identical vector
|
|
156
|
-
&& self.vec_counter.get(self.retriever.get_vector(n)) == 0
|
|
157
|
-
}
|
|
158
|
+
pub fn passes(&mut self, retriever: &'a impl DataRetriever, v: VectorAddr) -> bool {
|
|
159
|
+
let vector = retriever.get_vector(v);
|
|
160
|
+
let paragraph = retriever.paragraph(v);
|
|
158
161
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
162
|
+
// Matches query filters?
|
|
163
|
+
if !self.filter.contains(paragraph) {
|
|
164
|
+
return false;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Is a duplicated vector?
|
|
168
|
+
if self.vec_counter.get(vector) > 0 {
|
|
169
|
+
return false;
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
// Is a vector for an existing paragraph? (only relevant in multi-vector search)
|
|
173
|
+
if let Some(paragraphs) = &mut self.paragraphs
|
|
174
|
+
&& !paragraphs.insert(paragraph)
|
|
175
|
+
{
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// Track the vector for duplicates (the paragraphs was tracked in the above check)
|
|
180
|
+
self.vec_counter.add(vector);
|
|
181
|
+
|
|
182
|
+
true
|
|
164
183
|
}
|
|
165
184
|
}
|
|
166
185
|
|
|
@@ -228,7 +247,7 @@ impl<'a, DR: DataRetriever> HnswOps<'a, DR> {
|
|
|
228
247
|
query: &SearchVector,
|
|
229
248
|
layer: L,
|
|
230
249
|
number_of_results: usize,
|
|
231
|
-
mut filter: NodeFilter<'a
|
|
250
|
+
mut filter: NodeFilter<'a>,
|
|
232
251
|
) -> Vec<(VectorAddr, f32)> {
|
|
233
252
|
// We just need to perform BFS, the replacement is the closest node to the actual
|
|
234
253
|
// best solution. This algorithm takes a lazy approach to computing the similarity of
|
|
@@ -253,9 +272,7 @@ impl<'a, DR: DataRetriever> HnswOps<'a, DR> {
|
|
|
253
272
|
break;
|
|
254
273
|
}
|
|
255
274
|
|
|
256
|
-
|
|
257
|
-
if filter.is_valid(candidate, candidate_similarity) && filter.passes_formula(paragraph_addr) {
|
|
258
|
-
filter.add_result(candidate);
|
|
275
|
+
if !candidate_similarity.is_nan() && filter.passes(self.retriever, candidate) {
|
|
259
276
|
results.push((candidate, candidate_similarity));
|
|
260
277
|
}
|
|
261
278
|
|
|
@@ -338,7 +355,10 @@ impl<'a, DR: DataRetriever> HnswOps<'a, DR> {
|
|
|
338
355
|
_ => (),
|
|
339
356
|
}
|
|
340
357
|
}
|
|
341
|
-
ms_neighbours
|
|
358
|
+
ms_neighbours
|
|
359
|
+
.into_sorted_vec()
|
|
360
|
+
.into_iter()
|
|
361
|
+
.map(|Reverse(CnxWithBound(n, d))| (n, d))
|
|
342
362
|
}
|
|
343
363
|
|
|
344
364
|
fn layer_insert(
|
|
@@ -408,8 +428,7 @@ impl<'a, DR: DataRetriever> HnswOps<'a, DR> {
|
|
|
408
428
|
query: &SearchVector,
|
|
409
429
|
hnsw: H,
|
|
410
430
|
k_neighbours: usize,
|
|
411
|
-
|
|
412
|
-
with_duplicates: bool,
|
|
431
|
+
filter: NodeFilter,
|
|
413
432
|
) -> Neighbours {
|
|
414
433
|
if k_neighbours == 0 {
|
|
415
434
|
return Neighbours::with_capacity(0);
|
|
@@ -442,7 +461,10 @@ impl<'a, DR: DataRetriever> HnswOps<'a, DR> {
|
|
|
442
461
|
let last_layer_k = if original_query.is_some() {
|
|
443
462
|
std::cmp::min(k_neighbours * rabitq::RERANKING_FACTOR, rabitq::RERANKING_LIMIT)
|
|
444
463
|
} else {
|
|
445
|
-
|
|
464
|
+
// We search for at least EF_SEARCH neighbours to guarantee good results
|
|
465
|
+
// In the case k > EF we could use EF search and expand the search with
|
|
466
|
+
// closest_up_nodes()
|
|
467
|
+
std::cmp::max(k_neighbours, EF_SEARCH)
|
|
446
468
|
};
|
|
447
469
|
|
|
448
470
|
// Find the best k nodes in the last layer
|
|
@@ -466,20 +488,12 @@ impl<'a, DR: DataRetriever> HnswOps<'a, DR> {
|
|
|
466
488
|
neighbours.map(|(addr, _)| addr).collect()
|
|
467
489
|
};
|
|
468
490
|
|
|
469
|
-
let filter = NodeFilter {
|
|
470
|
-
filter: with_filter,
|
|
471
|
-
retriever: self.retriever,
|
|
472
|
-
paragraphs: Default::default(),
|
|
473
|
-
vec_counter: RepCounter::new(!with_duplicates),
|
|
474
|
-
};
|
|
475
|
-
let layer_zero = hnsw.get_layer(0);
|
|
476
|
-
|
|
477
491
|
// Find k nodes that match the filter in the last layer
|
|
478
492
|
let t = Instant::now();
|
|
479
493
|
let mut filtered_result = self.closest_up_nodes(
|
|
480
494
|
entry_points,
|
|
481
495
|
original_query.unwrap_or(query),
|
|
482
|
-
|
|
496
|
+
hnsw.get_layer(0),
|
|
483
497
|
k_neighbours,
|
|
484
498
|
filter,
|
|
485
499
|
);
|
|
@@ -44,5 +44,8 @@ pub const M_MAX: usize = 30;
|
|
|
44
44
|
/// Number of bi-directional links created for every new element.
|
|
45
45
|
pub const M: usize = 30;
|
|
46
46
|
|
|
47
|
-
/// Number of neighbours that are
|
|
47
|
+
/// Number of neighbours that are explored when searching for the insertion place of a new node
|
|
48
48
|
pub const EF_CONSTRUCTION: usize = 100;
|
|
49
|
+
|
|
50
|
+
/// Number of neighbours that are explored when searching for a query
|
|
51
|
+
pub const EF_SEARCH: usize = 30;
|
|
@@ -24,5 +24,5 @@ mod params;
|
|
|
24
24
|
mod ram_hnsw;
|
|
25
25
|
|
|
26
26
|
pub use disk_hnsw::DiskHnsw;
|
|
27
|
-
pub use ops_hnsw::{Cnx, DataRetriever, EstimatedScore, HnswOps, SearchVector};
|
|
27
|
+
pub use ops_hnsw::{Cnx, DataRetriever, EstimatedScore, HnswOps, NodeFilter, SearchVector};
|
|
28
28
|
pub use ram_hnsw::RAMHnsw;
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
use std::{collections::HashSet, fs::File, io::BufWriter, path::Path, sync::Arc};
|
|
21
21
|
|
|
22
22
|
use fst::{Automaton, IntoStreamer, Map, Streamer};
|
|
23
|
-
use memmap2::Mmap;
|
|
23
|
+
use memmap2::{Mmap, MmapOptions};
|
|
24
24
|
|
|
25
25
|
use crate::VectorR;
|
|
26
26
|
|
|
@@ -59,9 +59,14 @@ pub struct FstIndexReader {
|
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
impl FstIndexReader {
|
|
62
|
-
pub fn open(path: &Path, map_reader: Arc<InvertedMapReader
|
|
62
|
+
pub fn open(path: &Path, map_reader: Arc<InvertedMapReader>, prewarm: bool) -> VectorR<Self> {
|
|
63
|
+
let mut options = MmapOptions::new();
|
|
64
|
+
if prewarm {
|
|
65
|
+
options.populate();
|
|
66
|
+
}
|
|
67
|
+
|
|
63
68
|
Ok(Self {
|
|
64
|
-
fst: Map::new(unsafe {
|
|
69
|
+
fst: Map::new(unsafe { options.map(&File::open(path)?)? })?,
|
|
65
70
|
map_reader,
|
|
66
71
|
})
|
|
67
72
|
}
|
|
@@ -132,8 +137,8 @@ mod tests {
|
|
|
132
137
|
map_writer.finish()?;
|
|
133
138
|
|
|
134
139
|
// Check the map has the same contents we initialized
|
|
135
|
-
let map_reader = Arc::new(InvertedMapReader::open(tmp_map.path())?);
|
|
136
|
-
let reader = FstIndexReader::open(tmp.path(), map_reader)?;
|
|
140
|
+
let map_reader = Arc::new(InvertedMapReader::open(tmp_map.path(), false)?);
|
|
141
|
+
let reader = FstIndexReader::open(tmp.path(), map_reader, false)?;
|
|
137
142
|
|
|
138
143
|
for (key, value) in entries {
|
|
139
144
|
let indexed = reader.get(&key);
|
{nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/inverted_index/map.rs
RENAMED
|
@@ -23,7 +23,7 @@ use std::{
|
|
|
23
23
|
path::Path,
|
|
24
24
|
};
|
|
25
25
|
|
|
26
|
-
use memmap2::Mmap;
|
|
26
|
+
use memmap2::{Mmap, MmapOptions};
|
|
27
27
|
use stream_vbyte::{decode::decode, encode::encode, scalar::Scalar};
|
|
28
28
|
|
|
29
29
|
use crate::VectorR;
|
|
@@ -67,9 +67,14 @@ pub struct InvertedMapReader {
|
|
|
67
67
|
}
|
|
68
68
|
|
|
69
69
|
impl InvertedMapReader {
|
|
70
|
-
pub fn open(path: &Path) -> VectorR<Self> {
|
|
70
|
+
pub fn open(path: &Path, prewarm: bool) -> VectorR<Self> {
|
|
71
|
+
let mut options = MmapOptions::new();
|
|
72
|
+
if prewarm {
|
|
73
|
+
options.populate();
|
|
74
|
+
}
|
|
75
|
+
|
|
71
76
|
Ok(Self {
|
|
72
|
-
data: unsafe {
|
|
77
|
+
data: unsafe { options.map(&File::open(path)?)? },
|
|
73
78
|
})
|
|
74
79
|
}
|
|
75
80
|
|
|
@@ -120,7 +125,7 @@ mod tests {
|
|
|
120
125
|
writer.finish()?;
|
|
121
126
|
|
|
122
127
|
// Check the map has the same contents we initialized
|
|
123
|
-
let reader = InvertedMapReader::open(tmp.path())?;
|
|
128
|
+
let reader = InvertedMapReader::open(tmp.path(), false)?;
|
|
124
129
|
for i in 0..20 {
|
|
125
130
|
let indexed = reader.get(indexes[i]);
|
|
126
131
|
assert_eq!(indexed, entries[i]);
|
|
@@ -151,6 +151,10 @@ pub fn build_indexes(work_path: &Path, data_store: &impl DataStore) -> VectorR<(
|
|
|
151
151
|
Ok(())
|
|
152
152
|
}
|
|
153
153
|
|
|
154
|
+
pub struct OpenOptions {
|
|
155
|
+
pub prewarm: bool,
|
|
156
|
+
}
|
|
157
|
+
|
|
154
158
|
pub struct InvertedIndexes {
|
|
155
159
|
field_index: FstIndexReader,
|
|
156
160
|
label_index: FstIndexReader,
|
|
@@ -166,10 +170,13 @@ impl InvertedIndexes {
|
|
|
166
170
|
path.join(file::INDEX_MAP).exists()
|
|
167
171
|
}
|
|
168
172
|
|
|
169
|
-
pub fn open(work_path: &Path, records: usize) -> VectorR<Self> {
|
|
170
|
-
let map = Arc::new(InvertedMapReader::open(
|
|
171
|
-
|
|
172
|
-
|
|
173
|
+
pub fn open(work_path: &Path, records: usize, options: OpenOptions) -> VectorR<Self> {
|
|
174
|
+
let map = Arc::new(InvertedMapReader::open(
|
|
175
|
+
&work_path.join(file::INDEX_MAP),
|
|
176
|
+
options.prewarm,
|
|
177
|
+
)?);
|
|
178
|
+
let field_index = FstIndexReader::open(&work_path.join(file::FIELD_INDEX), map.clone(), options.prewarm)?;
|
|
179
|
+
let label_index = FstIndexReader::open(&work_path.join(file::LABEL_INDEX), map, options.prewarm)?;
|
|
173
180
|
|
|
174
181
|
Ok(Self {
|
|
175
182
|
field_index,
|
|
@@ -24,13 +24,13 @@ mod tests;
|
|
|
24
24
|
use crate::config::{VectorConfig, flags};
|
|
25
25
|
use crate::data_store::{DataStore, DataStoreV1, DataStoreV2, OpenReason, ParagraphRef, VectorRef};
|
|
26
26
|
use crate::formula::Formula;
|
|
27
|
-
use crate::hnsw::*;
|
|
28
27
|
use crate::inverted_index::{FilterBitSet, InvertedIndexes, build_indexes};
|
|
29
28
|
use crate::vector_types::rabitq;
|
|
30
29
|
use crate::{ParagraphAddr, VectorAddr, VectorErr, VectorR, VectorSegmentMeta, VectorSegmentMetadata};
|
|
30
|
+
use crate::{hnsw::*, inverted_index};
|
|
31
31
|
use core::f32;
|
|
32
32
|
use io::{BufWriter, Write};
|
|
33
|
-
use memmap2::Mmap;
|
|
33
|
+
use memmap2::{Mmap, MmapOptions};
|
|
34
34
|
use std::cmp::Reverse;
|
|
35
35
|
use std::collections::HashSet;
|
|
36
36
|
use std::fs::File;
|
|
@@ -48,9 +48,12 @@ mod file_names {
|
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
pub fn open(metadata: VectorSegmentMetadata, config: &VectorConfig) -> VectorR<OpenSegment> {
|
|
51
|
+
// TODO: we should get this flag from the VectorConfig or some other place
|
|
52
|
+
let prewarm = false;
|
|
53
|
+
|
|
51
54
|
let path = &metadata.path;
|
|
52
55
|
let data_store: Box<dyn DataStore> = if DataStoreV1::exists(path)? {
|
|
53
|
-
let data_store = DataStoreV1::open(path, &config.vector_type, OpenReason::Search)?;
|
|
56
|
+
let data_store = DataStoreV1::open(path, &config.vector_type, OpenReason::Search { prewarm })?;
|
|
54
57
|
// Build the index at runtime if they do not exist. This can
|
|
55
58
|
// be removed once we have migrated all existing indexes
|
|
56
59
|
if !InvertedIndexes::exists(path) {
|
|
@@ -58,7 +61,7 @@ pub fn open(metadata: VectorSegmentMetadata, config: &VectorConfig) -> VectorR<O
|
|
|
58
61
|
}
|
|
59
62
|
Box::new(data_store)
|
|
60
63
|
} else {
|
|
61
|
-
let data_store = DataStoreV2::open(path, &config.vector_type, OpenReason::Search)?;
|
|
64
|
+
let data_store = DataStoreV2::open(path, &config.vector_type, OpenReason::Search { prewarm })?;
|
|
62
65
|
// Build the index at runtime if they do not exist. This can
|
|
63
66
|
// be removed once we have migrated all existing indexes
|
|
64
67
|
if !InvertedIndexes::exists(path) {
|
|
@@ -66,9 +69,13 @@ pub fn open(metadata: VectorSegmentMetadata, config: &VectorConfig) -> VectorR<O
|
|
|
66
69
|
}
|
|
67
70
|
Box::new(data_store)
|
|
68
71
|
};
|
|
69
|
-
let hnsw_file = File::open(path.join(file_names::HNSW))?;
|
|
70
72
|
|
|
71
|
-
let
|
|
73
|
+
let hnsw_file = File::open(path.join(file_names::HNSW))?;
|
|
74
|
+
let mut index_options = MmapOptions::new();
|
|
75
|
+
if prewarm {
|
|
76
|
+
index_options.populate();
|
|
77
|
+
}
|
|
78
|
+
let index = unsafe { index_options.map(&hnsw_file)? };
|
|
72
79
|
|
|
73
80
|
// Telling the OS our expected access pattern
|
|
74
81
|
#[cfg(not(target_os = "windows"))]
|
|
@@ -77,7 +84,7 @@ pub fn open(metadata: VectorSegmentMetadata, config: &VectorConfig) -> VectorR<O
|
|
|
77
84
|
index.advise(memmap2::Advice::WillNeed)?;
|
|
78
85
|
}
|
|
79
86
|
|
|
80
|
-
let inverted_indexes = InvertedIndexes::open(path, metadata.records)?;
|
|
87
|
+
let inverted_indexes = InvertedIndexes::open(path, metadata.records, inverted_index::OpenOptions { prewarm })?;
|
|
81
88
|
let alive_bitset = FilterBitSet::new(metadata.records, true);
|
|
82
89
|
|
|
83
90
|
Ok(OpenSegment {
|
|
@@ -189,7 +196,11 @@ fn merge_indexes<DS: DataStore + 'static>(
|
|
|
189
196
|
};
|
|
190
197
|
|
|
191
198
|
build_indexes(segment_path, &data_store)?;
|
|
192
|
-
let inverted_indexes = InvertedIndexes::open(
|
|
199
|
+
let inverted_indexes = InvertedIndexes::open(
|
|
200
|
+
segment_path,
|
|
201
|
+
merged_vectors_count as usize,
|
|
202
|
+
inverted_index::OpenOptions { prewarm: false },
|
|
203
|
+
)?;
|
|
193
204
|
let alive_bitset = FilterBitSet::new(metadata.records, true);
|
|
194
205
|
|
|
195
206
|
Ok(OpenSegment {
|
|
@@ -289,7 +300,11 @@ fn create_indexes<DS: DataStore + 'static>(
|
|
|
289
300
|
};
|
|
290
301
|
|
|
291
302
|
build_indexes(path, &data_store)?;
|
|
292
|
-
let inverted_indexes = InvertedIndexes::open(
|
|
303
|
+
let inverted_indexes = InvertedIndexes::open(
|
|
304
|
+
path,
|
|
305
|
+
vector_count as usize,
|
|
306
|
+
inverted_index::OpenOptions { prewarm: false },
|
|
307
|
+
)?;
|
|
293
308
|
let alive_bitset = FilterBitSet::new(metadata.records, true);
|
|
294
309
|
|
|
295
310
|
Ok(OpenSegment {
|
|
@@ -533,7 +548,8 @@ impl OpenSegment {
|
|
|
533
548
|
} else {
|
|
534
549
|
method = "hnsw";
|
|
535
550
|
let ops = HnswOps::new(&retriever, true);
|
|
536
|
-
let
|
|
551
|
+
let filter = NodeFilter::new(bitset, with_duplicates, config);
|
|
552
|
+
let neighbours = ops.search(encoded_query, self.index.as_ref(), top_k, filter);
|
|
537
553
|
Box::new(
|
|
538
554
|
neighbours
|
|
539
555
|
.into_iter()
|
|
@@ -13,7 +13,7 @@ classifiers = [
|
|
|
13
13
|
"Programming Language :: Python :: Implementation :: CPython",
|
|
14
14
|
"Programming Language :: Python :: Implementation :: PyPy",
|
|
15
15
|
]
|
|
16
|
-
version = "6.9.1.
|
|
16
|
+
version = "6.9.1.post616"
|
|
17
17
|
|
|
18
18
|
[project.urls]
|
|
19
19
|
Homepage = "https://nuclia.com"
|
|
@@ -23,8 +23,6 @@ use std::io::Write;
|
|
|
23
23
|
use std::str::FromStr;
|
|
24
24
|
use std::sync::Arc;
|
|
25
25
|
|
|
26
|
-
use crate::errors::NidxError;
|
|
27
|
-
use crate::metadata::{Index, IndexId, IndexKind, Shard};
|
|
28
26
|
use axum::body::{Body, Bytes};
|
|
29
27
|
use axum::extract::{Path, State};
|
|
30
28
|
use axum::http::StatusCode;
|
|
@@ -41,6 +39,8 @@ use tracing::error;
|
|
|
41
39
|
use uuid::Uuid;
|
|
42
40
|
|
|
43
41
|
use crate::api::shards;
|
|
42
|
+
use crate::errors::NidxError;
|
|
43
|
+
use crate::metadata::{Index, IndexId, IndexKind, Shard};
|
|
44
44
|
use crate::{NidxMetadata, Settings, import_export};
|
|
45
45
|
|
|
46
46
|
#[derive(Clone)]
|
|
@@ -139,6 +139,10 @@ impl NidxApi for ApiServer {
|
|
|
139
139
|
}))
|
|
140
140
|
}
|
|
141
141
|
|
|
142
|
+
async fn configure_shards(&self, _request: Request<ShardsConfig>) -> Result<Response<EmptyQuery>> {
|
|
143
|
+
Ok(Response::new(EmptyQuery {}))
|
|
144
|
+
}
|
|
145
|
+
|
|
142
146
|
async fn add_vector_set(&self, request: Request<NewVectorSetRequest>) -> Result<Response<OpStatus>> {
|
|
143
147
|
let request = request.into_inner();
|
|
144
148
|
let Some(VectorSetId {
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|