nidx-binding 6.9.3.post626__tar.gz → 6.9.3.post636__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.3.post626 → nidx_binding-6.9.3.post636}/PKG-INFO +1 -1
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_protos/pyproject.toml +1 -1
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/hnsw/ram_hnsw.rs +23 -2
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/hnsw/search.rs +25 -23
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/hnsw.rs +1 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/segment.rs +42 -10
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/pyproject.toml +1 -1
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.config/nextest.toml +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-0cfce9b29547f8f5bafa6e440f86103be7b8c4ad2fd92db9ac223f4efbe23d10.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-1a561eed00f3dbe868bf5030059793300209179dc8fb73e4b57a54b5e81262fe.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-1d3fca2682e25a01143da92285297f134a6a105a96f64d87e0db3abb219855e4.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-249b3b57c27a71baa823f1fe0f0bba9c9af36f61c28f731e58beea60ec48e687.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-24cb6b683daa42d7125f862e25943ab4be7bf275cd8739f8da4859d701795e1a.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-263c8fce6db5b03bbd012fafdba6943cbee6ed7eb8976cdef4f5b01dde7ca6fd.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-2a5d92fb1638df830a4477a7cdf24e6db6b43034b7bbe74fdfb63e8afe2c4071.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-2b065a363f58caed60e3706603c1260dbf5a4c795604a5b68edda22eb07fec1b.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-3fc3cb39934683de8cd475ce1368c8373453eb1e01f81587d66b9d14b109ce6e.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-48f33b77b7c1633467b0b2efcaa1d3c207e7757e4f1d83b40d15e6ca365f7771.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-4ae09f2c08e2f324bee01bb8487a8f37678a1c5e9d327339235c50d4921a8949.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-4d7a76fa413c9ef0ce2a47ac7bb7e01d3e6a2aabded9487d21010a53efee8852.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-4fcbdd6657c7dc9b60b3a563dd41711b3dbcf72ce063427b7a01f8cddf34c244.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-577109ac00ccfbd38ecaccab94116f2f46a4caf5612afa372cded197123c1e08.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-5db25f97d8578d6d78f2f6bd4b72cc82a9b1b82805c6422d967ac63b20d99db4.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-5ec3233a3a23e926055056d46bdde17836a633066dbb5f349502648cd3ea9a60.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-66edb6ea424d8681927dcddb6bac5f1239175f4775d1f40417ba15054b0c6f19.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-6f9c6d201c1b5712efb68c363bffd3e0169c11f2a8f925e8cd4e8808599ff7b4.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-733c3ebacc86f444bf5e2dd79ade660c291e88a00fc09b722f6e2e191545874c.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-7a3bf27c330c468a596e8a297cf7d8b192e31e67ecc5177c1267f579e8e247c7.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-7a7e59e47b30b12237511fd3d7da2d17b0471ad2b006af48d6a6f587c779692b.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-7dcbb33312cc9f11ae3a6d73b1ace017a9f19a8bf8f10304fc57977c8efeadff.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-7efa7c0d747afc4b6aed0586ff846c27839c3213ff7ee9f30c89b0d0f17e60e3.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-8493140d788604d498a4e48da4158708572ccc9d60185290a00d549cc84533db.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-8493bb0059b013eaca42fd10cd7d04f0d06a8acaed379eff0d23f3229edde9ee.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-87996b3d6c7a2195438d7038015b06949102bce8c7b8cd8db1f83aaf23cbe489.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-8d33717587c6ee8f5fc339a80b1212a73d6c03e45856b1d55457fc8074709dd0.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-8f096d8171b89f9615d18f95d696dc9e4fb3674e103161a713cdc806f7a68506.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-917732a56ee04bf3a6e127319dda8225210869c82f9828d878162394dba4e078.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-95fe4ef93ee90733db1b67ed7987f80b5aac792f1590b979c68b418d1599eb98.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-9b67658569b343d8b4b61ae0a7dc721f367f2ba33c7b69b9e68bfd5c9bff5206.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-9c8062ea55d070afef68309e58fa987eb37fda44e1efbf68c8ba2af7846cc968.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-a06e1d9f6f95e4c4c2b98310ebddcc9d963cc033582bf2e945e8bf3a301b4247.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-a55265c9b07bd1399961a6f1e757201fd0eebe868ddaf96437111113d80fce92.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-a60ec2f66f1e7b84189e5b089f2087a29ff6a64326a3743dea935bbc58ee77fa.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-a891a37be5c2d7cce775c2dd33726b0318fd3839beab222a1b22bc6174604207.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-a945191bb4b3e37d6823ed3ad499339d007d69983105de8567777d9daf517b28.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-abe9f7832f2bd799ac44008da031e8d8ab52d4f5fbfc2a7e3974e8873bae55b2.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-aca588cca57a85e4d7fcc40c23cd87e57d53d11ca550d78e7e3d5e39e524fcd3.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-b02f8aafc00a7724510772ac41269e368c5bccf03ef7b4590e0ef6fd1a1bf64f.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-b742e17cabe2d64617e9aa64bafc782172f7a4f8023d1b54f952a0fb39f6b2b8.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-b94e349dbc0daec57f8f8f6e9e2dffb06100b1bb2b41d297c9f3b191da37a83d.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-bd9afa22994aba671dbf7b5f89b53c2ee02f53c0442a81265786a6d52d08512f.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-be60554eca98a5899efc6b49785cecd6444a6d39afed9e4a884ce2dbf162012c.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-bf49702b506c9a1650ece1f8e8d9f14834a902f8caefafe30ded55e2790f2188.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-bfcd21ed704cd305db5c17fcdec7d92aa4ac501913c9c9514d8ff92928c0c7e7.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-c3ab694650f49a75b146fb877a92e48c4f20f0d99f70f8ec859fbb763b01a1e5.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-c55542bb9fae544d87fae6f30e0fe8a9088d12075f4442ab4fe2fcd05e472234.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-cb29a6556d35ac630ee0aa885dd7341cf9573bd3efd216ff8a887b87686b03db.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-d0a1f341a89f5f14696b10baa72db9d95551c2b7e5fc67308fd52dc03dd98a92.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-d2ad0a0ca2649c9e4873cfcc1fc66d2d07cc45d0f65c560b06d7b5f592f4fa8a.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-d6cfe78eb635ba0b89ca4021a4dc8182d18ab5b197f30149cd28488eba4c1df5.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-d729b56dea00e49dcdba8cf0001e2811da27351eabe98212db3b589f18fc6f32.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-d9658bfd4e7170b41d03f2ddf2446d0bf54171c0d39d53bf20af2b8437f2ec48.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-dbba7b3d3289425bae711aedbf73fbc3699f857f86f84d95c3b556d05c5658b0.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-dcb96b649d6d63a58efd5d445453a4f3d7869a56ff714b69bedf3d616a0473ca.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-ebd876fbf5362a5900e75bc05f2f11c73c406ef7da4e95097fc6a1c3d1b8bc54.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-eef5cc6bce1cc14eba8f3e68971724ef181e88cffcedd74673615f2026b89a62.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-ef56d5fefc5774040d1ee397beadb475f6af02768c22f0e583c74062e2e821ce.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/Cargo.lock +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/Cargo.toml +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/README.md +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/migrations/20241007163501_initial.sql +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/migrations/20241211120039_merge_job_priority.sql +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/migrations/20241211121159_basic_indexes.sql +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/migrations/20241212151105_check_segment_records.sql +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/migrations/20250110145554_in_flight_messages.sql +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_binding/Cargo.toml +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_binding/src/lib.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/Cargo.toml +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/src/fuzzy_query.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/src/lib.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/src/query_io.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/src/query_parser/fuzzy_parser.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/src/query_parser/keyword_parser.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/src/query_parser/stop_words.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/src/query_parser/tokenizer.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/src/query_parser.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/src/reader.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/src/request_types.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/src/resource_indexer.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/src/schema.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/src/search_query.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/src/search_response.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/src/set_query.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/README.md +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/ar.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/az.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/bn.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/ca.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/ch.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/da.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/de.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/el.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/en.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/es.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/eu.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/extract.py +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/fi.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/fr.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/he.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/hu.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/id.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/it.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/kk.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/ne.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/nl.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/no.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/pt.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/ro.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/ru.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/sl.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/sv.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/tg.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/tr.json +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/tests/common/mod.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/tests/reader.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_protos/Cargo.toml +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_protos/build.py +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_protos/build.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_protos/nidx.proto +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_protos/nodereader.proto +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_protos/noderesources.proto +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_protos/nodewriter.proto +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_protos/src/lib.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_relation/Cargo.toml +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_relation/src/graph_collector.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_relation/src/graph_query_parser.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_relation/src/io_maps.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_relation/src/lib.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_relation/src/reader.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_relation/src/resource_indexer.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_relation/src/schema.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_relation/src/top_unique_n.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_relation/tests/common/mod.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_relation/tests/test_graph_query_parser_search.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_relation/tests/test_graph_search.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_relation/tests/test_writer.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_tantivy/Cargo.toml +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_tantivy/src/index_reader.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_tantivy/src/lib.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_tantivy/src/utils.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_tests/Cargo.toml +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_tests/src/graph.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_tests/src/lib.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_text/Cargo.toml +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_text/src/lib.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_text/src/prefilter.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_text/src/query_io.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_text/src/reader.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_text/src/request_types.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_text/src/resource_indexer.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_text/src/schema.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_text/src/search_query.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_text/tests/common/mod.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_text/tests/test_deletions.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_text/tests/test_flow.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_text/tests/test_search.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_text/tests/test_streaming.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_types/Cargo.toml +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_types/src/lib.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_types/src/prefilter.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_types/src/query_language.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/Cargo.toml +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/config.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/data_store/v1/node.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/data_store/v1/store.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/data_store/v1/trie.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/data_store/v1/trie_ram.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/data_store/v1.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/data_store/v2/paragraph_store.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/data_store/v2/quant_vector_store.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/data_store/v2/vector_store.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/data_store/v2.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/data_store.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/data_types.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/formula.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/hnsw/build.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/hnsw/disk_hnsw.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/hnsw/params.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/indexer.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/inverted_index/fst_index.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/inverted_index/map.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/inverted_index.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/lib.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/multivector.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/query_io.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/request_types.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/searcher.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/segment/tests.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/utils.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/vector_types/dense_f32.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/vector_types/mod.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/vector_types/rabitq.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/tests/common/mod.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/tests/test_basic_search.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/tests/test_hidden.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/tests/test_maxsim.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/api/grpc.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/api/shards.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/api.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/control.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/errors.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/grpc_server.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/import_export.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/indexer.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/lib.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/main.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/metadata/deletion.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/metadata/index.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/metadata/index_request.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/metadata/merge_job.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/metadata/segment.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/metadata/shard.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/metadata.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/metrics.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/scheduler/audit_task.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/scheduler/log_merge.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/scheduler/merge_task.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/scheduler/metrics_task.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/scheduler/purge_tasks.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/scheduler/vector_merge.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/scheduler.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/searcher/grpc.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/searcher/index_cache.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/searcher/query_language.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/searcher/query_planner.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/searcher/shard_search.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/searcher/shard_selector.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/searcher/shard_suggest.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/searcher/streams.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/searcher/sync.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/searcher.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/segment_store.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/settings.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/telemetry/duration_layer.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/telemetry/log_format.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/telemetry/middleware.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/telemetry.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/tool.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/utilization_tracker.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/worker.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/tests/common/mod.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/tests/common/services.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/tests/test_date_range_search.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/tests/test_search_filtering.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/tests/test_search_relations.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/tests/test_search_sorting.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/tests/test_searcher_cluster.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/tests/test_security_search.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/tests/test_shards.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/tests/test_shards_api.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/tests/test_suggest.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/tests/test_synced_searcher.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/tests/test_vector_normalization.rs +0 -0
- {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/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.3.
|
|
3
|
+
Version: 6.9.3.post636
|
|
4
4
|
Classifier: Programming Language :: Rust
|
|
5
5
|
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
6
6
|
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
|
@@ -10,7 +10,7 @@ build-backend = "pdm.backend"
|
|
|
10
10
|
|
|
11
11
|
[project]
|
|
12
12
|
name = "nidx_protos"
|
|
13
|
-
version = "6.9.3.
|
|
13
|
+
version = "6.9.3.post636"
|
|
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" }]
|
|
@@ -113,10 +113,31 @@ impl RAMHnsw {
|
|
|
113
113
|
/// A bug in a previous version of this program could cause a node in layer N
|
|
114
114
|
/// to link to a node in layer N-1. This breaks navigation accross layer N.
|
|
115
115
|
/// This function will delete any such link from the graph.
|
|
116
|
-
|
|
116
|
+
/// Also delete empty layers and entrypoints pointing to unexisting layers
|
|
117
|
+
pub fn fix_broken_graph(&mut self) {
|
|
118
|
+
// Fix links to a node not in this lauer
|
|
117
119
|
for l in &self.layers[1..] {
|
|
118
120
|
l.fix_broken_links();
|
|
119
121
|
}
|
|
122
|
+
|
|
123
|
+
// Delete empty layers
|
|
124
|
+
while let Some(layer) = self.layers.last() {
|
|
125
|
+
if layer.out.is_empty() {
|
|
126
|
+
self.layers.pop();
|
|
127
|
+
} else {
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// If entrypoint point to non-existing layer, point it to the top-most layer
|
|
133
|
+
if self.entry_point.layer >= self.layers.len() {
|
|
134
|
+
self.entry_point.layer = self.layers.len() - 1;
|
|
135
|
+
let last_layer = self.layers.last().unwrap();
|
|
136
|
+
if !last_layer.contains(&self.entry_point.node) {
|
|
137
|
+
// If the current entrypoint node is not in the last layer, point to another node that is here
|
|
138
|
+
self.entry_point.node = *self.layers.last().unwrap().out.keys().next().unwrap();
|
|
139
|
+
}
|
|
140
|
+
}
|
|
120
141
|
}
|
|
121
142
|
}
|
|
122
143
|
|
|
@@ -172,7 +193,7 @@ mod tests {
|
|
|
172
193
|
let mut graph = RAMHnsw::new();
|
|
173
194
|
graph.layers.push(layer0);
|
|
174
195
|
graph.layers.push(layer1);
|
|
175
|
-
graph.
|
|
196
|
+
graph.fix_broken_graph();
|
|
176
197
|
assert!(graph.layers[1].out[&VectorAddr(0)].read().unwrap().is_empty());
|
|
177
198
|
}
|
|
178
199
|
}
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
use bit_set::BitSet;
|
|
22
22
|
use rustc_hash::FxHashSet;
|
|
23
23
|
use std::cmp::{Ordering, Reverse};
|
|
24
|
-
use std::collections::{BinaryHeap, HashMap
|
|
24
|
+
use std::collections::{BinaryHeap, HashMap};
|
|
25
25
|
use std::time::Instant;
|
|
26
26
|
use tracing::trace;
|
|
27
27
|
|
|
@@ -190,33 +190,29 @@ impl<'a, DR: DataRetriever> HnswSearcher<'a, DR> {
|
|
|
190
190
|
}
|
|
191
191
|
}
|
|
192
192
|
|
|
193
|
+
/// Breadth-first search to find the closest nodes to the entry-points that fulfill the filtering conditions
|
|
193
194
|
fn closest_up_nodes<L: SearchableLayer>(
|
|
194
195
|
&'a self,
|
|
195
|
-
entry_points: Vec<
|
|
196
|
+
entry_points: Vec<Cnx>,
|
|
196
197
|
query: &SearchVector,
|
|
197
198
|
layer: L,
|
|
198
199
|
number_of_results: usize,
|
|
199
200
|
mut filter: NodeFilter<'a>,
|
|
200
201
|
) -> Vec<(VectorAddr, f32)> {
|
|
201
|
-
// We just need to perform BFS, the replacement is the closest node to the actual
|
|
202
|
-
// best solution. This algorithm takes a lazy approach to computing the similarity of
|
|
203
|
-
// candidates.
|
|
204
|
-
|
|
205
202
|
const MAX_VECTORS_TO_PRELOAD: u32 = 20_000;
|
|
206
203
|
let mut results = Vec::new();
|
|
207
|
-
let inner_entry_points_iter = entry_points.iter().map(|VectorAddr(inner)| *inner as usize);
|
|
204
|
+
let inner_entry_points_iter = entry_points.iter().map(|Cnx(VectorAddr(inner), _)| *inner as usize);
|
|
208
205
|
let mut visited_nodes: BitSet = BitSet::from_iter(inner_entry_points_iter);
|
|
209
|
-
let mut candidates =
|
|
206
|
+
let mut candidates = entry_points;
|
|
207
|
+
candidates.sort_unstable();
|
|
210
208
|
|
|
211
209
|
let mut preloaded = 0;
|
|
212
210
|
|
|
213
211
|
loop {
|
|
214
|
-
let Some(candidate) = candidates.
|
|
212
|
+
let Some(Cnx(candidate, candidate_similarity)) = candidates.pop() else {
|
|
215
213
|
break;
|
|
216
214
|
};
|
|
217
215
|
|
|
218
|
-
let candidate_similarity = self.retriever.similarity(candidate, query);
|
|
219
|
-
|
|
220
216
|
if candidate_similarity < self.retriever.min_score() {
|
|
221
217
|
break;
|
|
222
218
|
}
|
|
@@ -226,22 +222,28 @@ impl<'a, DR: DataRetriever> HnswSearcher<'a, DR> {
|
|
|
226
222
|
}
|
|
227
223
|
|
|
228
224
|
if results.len() == number_of_results {
|
|
229
|
-
|
|
225
|
+
break;
|
|
230
226
|
}
|
|
231
227
|
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
if !visited_nodes.contains(new_candidate.0 as usize) {
|
|
236
|
-
visited_nodes.insert(new_candidate.0 as usize);
|
|
237
|
-
candidates.push_back(new_candidate);
|
|
238
|
-
|
|
239
|
-
if self.preload_nodes && preloaded < MAX_VECTORS_TO_PRELOAD {
|
|
228
|
+
if self.preload_nodes && preloaded < MAX_VECTORS_TO_PRELOAD {
|
|
229
|
+
for (new_candidate, _) in layer.get_out_edges(candidate) {
|
|
230
|
+
if !visited_nodes.contains(new_candidate.0 as usize) {
|
|
240
231
|
self.retriever.will_need(new_candidate);
|
|
241
232
|
preloaded += 1;
|
|
242
233
|
}
|
|
243
234
|
}
|
|
244
|
-
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
for (new_candidate, _) in layer.get_out_edges(candidate) {
|
|
238
|
+
if visited_nodes.insert(new_candidate.0 as usize) {
|
|
239
|
+
let new_similarity = self.retriever.similarity(new_candidate, query);
|
|
240
|
+
|
|
241
|
+
if new_similarity > self.retriever.min_score() {
|
|
242
|
+
candidates.push(Cnx(new_candidate, new_similarity));
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
candidates.sort_unstable();
|
|
245
247
|
}
|
|
246
248
|
|
|
247
249
|
results
|
|
@@ -364,13 +366,13 @@ impl<'a, DR: DataRetriever> HnswSearcher<'a, DR> {
|
|
|
364
366
|
let t = Instant::now();
|
|
365
367
|
let reranked = rabitq::rerank_top(neighbours.collect(), k_neighbours, self.retriever, query)
|
|
366
368
|
.into_iter()
|
|
367
|
-
.map(|Reverse(
|
|
369
|
+
.map(|Reverse(c)| c)
|
|
368
370
|
.collect();
|
|
369
371
|
let time = t.elapsed();
|
|
370
372
|
trace!(?time, "HNSW search: reranking");
|
|
371
373
|
reranked
|
|
372
374
|
} else {
|
|
373
|
-
neighbours.map(|(addr,
|
|
375
|
+
neighbours.map(|(addr, score)| Cnx(addr, score.score)).collect()
|
|
374
376
|
};
|
|
375
377
|
|
|
376
378
|
// Find k nodes that match the filter in the last layer
|
|
@@ -26,7 +26,7 @@ use crate::data_store::{DataStore, DataStoreV1, DataStoreV2, OpenReason, Paragra
|
|
|
26
26
|
use crate::formula::Formula;
|
|
27
27
|
use crate::inverted_index::{FilterBitSet, InvertedIndexes, build_indexes};
|
|
28
28
|
use crate::vector_types::rabitq;
|
|
29
|
-
use crate::{ParagraphAddr, VectorAddr, VectorErr, VectorR, VectorSegmentMeta, VectorSegmentMetadata};
|
|
29
|
+
use crate::{ParagraphAddr, VectorAddr, VectorErr, VectorR, VectorSegmentMeta, VectorSegmentMetadata, hnsw};
|
|
30
30
|
use crate::{hnsw::*, inverted_index};
|
|
31
31
|
use core::f32;
|
|
32
32
|
use io::{BufWriter, Write};
|
|
@@ -42,9 +42,6 @@ use std::path::Path;
|
|
|
42
42
|
use std::time::Instant;
|
|
43
43
|
use tracing::{debug, trace};
|
|
44
44
|
|
|
45
|
-
/// How much expensive is to find a node via HNSW compared to a simple brute force scan
|
|
46
|
-
const HNSW_COST_FACTOR: usize = 100;
|
|
47
|
-
|
|
48
45
|
mod file_names {
|
|
49
46
|
pub const HNSW: &str = "index.hnsw";
|
|
50
47
|
}
|
|
@@ -158,7 +155,7 @@ fn merge_indexes<DS: DataStore + 'static>(
|
|
|
158
155
|
// If there are no deletions, we can reuse the first segment
|
|
159
156
|
// HNSW since its indexes will match the the ones in data_store
|
|
160
157
|
index = DiskHnsw::deserialize(&operants[0].index);
|
|
161
|
-
index.
|
|
158
|
+
index.fix_broken_graph();
|
|
162
159
|
start_vector_index = operants[0].data_store.stored_vector_count();
|
|
163
160
|
}
|
|
164
161
|
let merged_vectors_count = data_store.stored_vector_count();
|
|
@@ -543,14 +540,10 @@ impl OpenSegment {
|
|
|
543
540
|
if matching == 0 {
|
|
544
541
|
return Box::new(empty());
|
|
545
542
|
}
|
|
546
|
-
let expected_traversal_scan = top_k * self.metadata.records / matching;
|
|
547
543
|
|
|
548
544
|
let t = Instant::now();
|
|
549
545
|
let method;
|
|
550
|
-
let results = if matching
|
|
551
|
-
method = "brute force";
|
|
552
|
-
self.brute_force_search(bitset, top_k, retriever, encoded_query, &raw_query)
|
|
553
|
-
} else {
|
|
546
|
+
let results = if use_hnsw(self.metadata.records, matching, top_k, rabitq) {
|
|
554
547
|
method = "hnsw";
|
|
555
548
|
let ops = HnswSearcher::new(&retriever, true);
|
|
556
549
|
let filter = NodeFilter::new(bitset, with_duplicates, config);
|
|
@@ -561,6 +554,9 @@ impl OpenSegment {
|
|
|
561
554
|
.map(|(address, dist)| ScoredVector::new(address, self.data_store.as_ref(), dist))
|
|
562
555
|
.take(top_k),
|
|
563
556
|
)
|
|
557
|
+
} else {
|
|
558
|
+
method = "brute force";
|
|
559
|
+
self.brute_force_search(bitset, top_k, retriever, encoded_query, &raw_query)
|
|
564
560
|
};
|
|
565
561
|
|
|
566
562
|
let time = t.elapsed();
|
|
@@ -627,6 +623,42 @@ impl OpenSegment {
|
|
|
627
623
|
}
|
|
628
624
|
}
|
|
629
625
|
|
|
626
|
+
fn use_hnsw(total_nodes: usize, matching_nodes: usize, top_k: usize, has_rabitq: bool) -> bool {
|
|
627
|
+
// Cost of a full vector comparison compared to a quantized vector comparison
|
|
628
|
+
let full_cost: usize;
|
|
629
|
+
// How many more vectors are evaluated in layer_search for quantized vectors
|
|
630
|
+
let search_mult: usize;
|
|
631
|
+
// How many vectors are reranked
|
|
632
|
+
let rerank_mult: usize;
|
|
633
|
+
if has_rabitq {
|
|
634
|
+
full_cost = 16;
|
|
635
|
+
search_mult = rabitq::RERANKING_FACTOR * 3 / 4;
|
|
636
|
+
rerank_mult = rabitq::RERANKING_FACTOR / 2;
|
|
637
|
+
} else {
|
|
638
|
+
full_cost = 1;
|
|
639
|
+
search_mult = 1;
|
|
640
|
+
rerank_mult = 0;
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
// Estimated vectors visited during hnsw search (quantized vectors)
|
|
644
|
+
let hnsw_rq = ((total_nodes as f32).ln() - 2.0).powi(2) * (top_k as f32).ln() * search_mult as f32;
|
|
645
|
+
// Estimated vectors visited in closest_up_nodes (full vectors)
|
|
646
|
+
let hnsw_full = (top_k * rerank_mult) + (top_k * hnsw::M * total_nodes / matching_nodes);
|
|
647
|
+
|
|
648
|
+
// Quantized vectors evaluated with brute-force
|
|
649
|
+
let bf_rq = matching_nodes;
|
|
650
|
+
// Estimated full vectors to be evaluated during rerank in brute-force
|
|
651
|
+
let bf_full = top_k * rerank_mult;
|
|
652
|
+
|
|
653
|
+
let hnsw_cost = hnsw_rq as usize + hnsw_full * full_cost;
|
|
654
|
+
let bf_cost = bf_rq + bf_full * full_cost;
|
|
655
|
+
|
|
656
|
+
let use_hnsw = hnsw_cost < bf_cost;
|
|
657
|
+
debug!(hnsw_cost, bf_cost, use_hnsw, "Estimated search costs");
|
|
658
|
+
|
|
659
|
+
use_hnsw
|
|
660
|
+
}
|
|
661
|
+
|
|
630
662
|
#[cfg(test)]
|
|
631
663
|
mod test {
|
|
632
664
|
use std::collections::{BTreeMap, HashSet};
|
|
@@ -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.3.
|
|
16
|
+
version = "6.9.3.post636"
|
|
17
17
|
|
|
18
18
|
[project.urls]
|
|
19
19
|
Homepage = "https://nuclia.com"
|
|
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
|
|
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
|
{nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/migrations/20241007163501_initial.sql
RENAMED
|
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
|
{nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/src/query_parser.rs
RENAMED
|
File without changes
|
|
File without changes
|
{nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/src/request_types.rs
RENAMED
|
File without changes
|
{nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/src/resource_indexer.rs
RENAMED
|
File without changes
|
|
File without changes
|
{nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/src/search_query.rs
RENAMED
|
File without changes
|
{nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/src/search_response.rs
RENAMED
|
File without changes
|
|
File without changes
|
{nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/README.md
RENAMED
|
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
|
{nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/extract.py
RENAMED
|
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
|
{nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/tests/common/mod.rs
RENAMED
|
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
|