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.
Files changed (263) hide show
  1. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/PKG-INFO +1 -1
  2. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_protos/nidx.proto +15 -1
  3. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_protos/nodewriter.proto +1 -0
  4. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_protos/pyproject.toml +1 -1
  5. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_protos/src/lib.rs +1 -0
  6. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/data_store/v1.rs +1 -1
  7. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/data_store/v2/paragraph_store.rs +1 -1
  8. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/data_store/v2/quant_vector_store.rs +7 -3
  9. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/data_store/v2/vector_store.rs +1 -1
  10. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/data_store.rs +1 -1
  11. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/hnsw/ops_hnsw.rs +49 -35
  12. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/hnsw/params.rs +4 -1
  13. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/hnsw.rs +1 -1
  14. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/inverted_index/fst_index.rs +10 -5
  15. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/inverted_index/map.rs +9 -4
  16. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/inverted_index.rs +11 -4
  17. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/segment.rs +26 -10
  18. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/pyproject.toml +1 -1
  19. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/api/grpc.rs +6 -2
  20. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.config/nextest.toml +0 -0
  21. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-0cfce9b29547f8f5bafa6e440f86103be7b8c4ad2fd92db9ac223f4efbe23d10.json +0 -0
  22. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-1a561eed00f3dbe868bf5030059793300209179dc8fb73e4b57a54b5e81262fe.json +0 -0
  23. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-1d3fca2682e25a01143da92285297f134a6a105a96f64d87e0db3abb219855e4.json +0 -0
  24. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-249b3b57c27a71baa823f1fe0f0bba9c9af36f61c28f731e58beea60ec48e687.json +0 -0
  25. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-24cb6b683daa42d7125f862e25943ab4be7bf275cd8739f8da4859d701795e1a.json +0 -0
  26. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-263c8fce6db5b03bbd012fafdba6943cbee6ed7eb8976cdef4f5b01dde7ca6fd.json +0 -0
  27. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-2a5d92fb1638df830a4477a7cdf24e6db6b43034b7bbe74fdfb63e8afe2c4071.json +0 -0
  28. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-2b065a363f58caed60e3706603c1260dbf5a4c795604a5b68edda22eb07fec1b.json +0 -0
  29. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-3fc3cb39934683de8cd475ce1368c8373453eb1e01f81587d66b9d14b109ce6e.json +0 -0
  30. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-48f33b77b7c1633467b0b2efcaa1d3c207e7757e4f1d83b40d15e6ca365f7771.json +0 -0
  31. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-4ae09f2c08e2f324bee01bb8487a8f37678a1c5e9d327339235c50d4921a8949.json +0 -0
  32. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-4d7a76fa413c9ef0ce2a47ac7bb7e01d3e6a2aabded9487d21010a53efee8852.json +0 -0
  33. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-4fcbdd6657c7dc9b60b3a563dd41711b3dbcf72ce063427b7a01f8cddf34c244.json +0 -0
  34. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-577109ac00ccfbd38ecaccab94116f2f46a4caf5612afa372cded197123c1e08.json +0 -0
  35. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-5db25f97d8578d6d78f2f6bd4b72cc82a9b1b82805c6422d967ac63b20d99db4.json +0 -0
  36. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-5ec3233a3a23e926055056d46bdde17836a633066dbb5f349502648cd3ea9a60.json +0 -0
  37. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-66edb6ea424d8681927dcddb6bac5f1239175f4775d1f40417ba15054b0c6f19.json +0 -0
  38. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-6f9c6d201c1b5712efb68c363bffd3e0169c11f2a8f925e8cd4e8808599ff7b4.json +0 -0
  39. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-733c3ebacc86f444bf5e2dd79ade660c291e88a00fc09b722f6e2e191545874c.json +0 -0
  40. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-7a3bf27c330c468a596e8a297cf7d8b192e31e67ecc5177c1267f579e8e247c7.json +0 -0
  41. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-7a7e59e47b30b12237511fd3d7da2d17b0471ad2b006af48d6a6f587c779692b.json +0 -0
  42. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-7dcbb33312cc9f11ae3a6d73b1ace017a9f19a8bf8f10304fc57977c8efeadff.json +0 -0
  43. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-7efa7c0d747afc4b6aed0586ff846c27839c3213ff7ee9f30c89b0d0f17e60e3.json +0 -0
  44. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-8493140d788604d498a4e48da4158708572ccc9d60185290a00d549cc84533db.json +0 -0
  45. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-8493bb0059b013eaca42fd10cd7d04f0d06a8acaed379eff0d23f3229edde9ee.json +0 -0
  46. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-87996b3d6c7a2195438d7038015b06949102bce8c7b8cd8db1f83aaf23cbe489.json +0 -0
  47. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-8d33717587c6ee8f5fc339a80b1212a73d6c03e45856b1d55457fc8074709dd0.json +0 -0
  48. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-8f096d8171b89f9615d18f95d696dc9e4fb3674e103161a713cdc806f7a68506.json +0 -0
  49. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-917732a56ee04bf3a6e127319dda8225210869c82f9828d878162394dba4e078.json +0 -0
  50. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-95fe4ef93ee90733db1b67ed7987f80b5aac792f1590b979c68b418d1599eb98.json +0 -0
  51. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-9b67658569b343d8b4b61ae0a7dc721f367f2ba33c7b69b9e68bfd5c9bff5206.json +0 -0
  52. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-9c8062ea55d070afef68309e58fa987eb37fda44e1efbf68c8ba2af7846cc968.json +0 -0
  53. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-a06e1d9f6f95e4c4c2b98310ebddcc9d963cc033582bf2e945e8bf3a301b4247.json +0 -0
  54. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-a55265c9b07bd1399961a6f1e757201fd0eebe868ddaf96437111113d80fce92.json +0 -0
  55. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-a60ec2f66f1e7b84189e5b089f2087a29ff6a64326a3743dea935bbc58ee77fa.json +0 -0
  56. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-a891a37be5c2d7cce775c2dd33726b0318fd3839beab222a1b22bc6174604207.json +0 -0
  57. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-a945191bb4b3e37d6823ed3ad499339d007d69983105de8567777d9daf517b28.json +0 -0
  58. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-abe9f7832f2bd799ac44008da031e8d8ab52d4f5fbfc2a7e3974e8873bae55b2.json +0 -0
  59. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-aca588cca57a85e4d7fcc40c23cd87e57d53d11ca550d78e7e3d5e39e524fcd3.json +0 -0
  60. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-b02f8aafc00a7724510772ac41269e368c5bccf03ef7b4590e0ef6fd1a1bf64f.json +0 -0
  61. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-b742e17cabe2d64617e9aa64bafc782172f7a4f8023d1b54f952a0fb39f6b2b8.json +0 -0
  62. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-b94e349dbc0daec57f8f8f6e9e2dffb06100b1bb2b41d297c9f3b191da37a83d.json +0 -0
  63. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-bd9afa22994aba671dbf7b5f89b53c2ee02f53c0442a81265786a6d52d08512f.json +0 -0
  64. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-be60554eca98a5899efc6b49785cecd6444a6d39afed9e4a884ce2dbf162012c.json +0 -0
  65. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-bf49702b506c9a1650ece1f8e8d9f14834a902f8caefafe30ded55e2790f2188.json +0 -0
  66. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-bfcd21ed704cd305db5c17fcdec7d92aa4ac501913c9c9514d8ff92928c0c7e7.json +0 -0
  67. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-c3ab694650f49a75b146fb877a92e48c4f20f0d99f70f8ec859fbb763b01a1e5.json +0 -0
  68. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-c55542bb9fae544d87fae6f30e0fe8a9088d12075f4442ab4fe2fcd05e472234.json +0 -0
  69. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-cb29a6556d35ac630ee0aa885dd7341cf9573bd3efd216ff8a887b87686b03db.json +0 -0
  70. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-d0a1f341a89f5f14696b10baa72db9d95551c2b7e5fc67308fd52dc03dd98a92.json +0 -0
  71. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-d2ad0a0ca2649c9e4873cfcc1fc66d2d07cc45d0f65c560b06d7b5f592f4fa8a.json +0 -0
  72. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-d6cfe78eb635ba0b89ca4021a4dc8182d18ab5b197f30149cd28488eba4c1df5.json +0 -0
  73. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-d729b56dea00e49dcdba8cf0001e2811da27351eabe98212db3b589f18fc6f32.json +0 -0
  74. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-d9658bfd4e7170b41d03f2ddf2446d0bf54171c0d39d53bf20af2b8437f2ec48.json +0 -0
  75. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-dbba7b3d3289425bae711aedbf73fbc3699f857f86f84d95c3b556d05c5658b0.json +0 -0
  76. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-dcb96b649d6d63a58efd5d445453a4f3d7869a56ff714b69bedf3d616a0473ca.json +0 -0
  77. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-ebd876fbf5362a5900e75bc05f2f11c73c406ef7da4e95097fc6a1c3d1b8bc54.json +0 -0
  78. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-eef5cc6bce1cc14eba8f3e68971724ef181e88cffcedd74673615f2026b89a62.json +0 -0
  79. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/.sqlx/query-ef56d5fefc5774040d1ee397beadb475f6af02768c22f0e583c74062e2e821ce.json +0 -0
  80. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/Cargo.lock +0 -0
  81. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/Cargo.toml +0 -0
  82. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/README.md +0 -0
  83. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/migrations/20241007163501_initial.sql +0 -0
  84. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/migrations/20241211120039_merge_job_priority.sql +0 -0
  85. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/migrations/20241211121159_basic_indexes.sql +0 -0
  86. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/migrations/20241212151105_check_segment_records.sql +0 -0
  87. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/migrations/20250110145554_in_flight_messages.sql +0 -0
  88. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_binding/Cargo.toml +0 -0
  89. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_binding/src/lib.rs +0 -0
  90. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/Cargo.toml +0 -0
  91. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/src/fuzzy_query.rs +0 -0
  92. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/src/lib.rs +0 -0
  93. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/src/query_io.rs +0 -0
  94. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/src/query_parser/fuzzy_parser.rs +0 -0
  95. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/src/query_parser/keyword_parser.rs +0 -0
  96. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/src/query_parser/stop_words.rs +0 -0
  97. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/src/query_parser/tokenizer.rs +0 -0
  98. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/src/query_parser.rs +0 -0
  99. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/src/reader.rs +0 -0
  100. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/src/request_types.rs +0 -0
  101. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/src/resource_indexer.rs +0 -0
  102. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/src/schema.rs +0 -0
  103. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/src/search_query.rs +0 -0
  104. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/src/search_response.rs +0 -0
  105. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/src/set_query.rs +0 -0
  106. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/README.md +0 -0
  107. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/ar.json +0 -0
  108. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/az.json +0 -0
  109. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/bn.json +0 -0
  110. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/ca.json +0 -0
  111. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/ch.json +0 -0
  112. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/da.json +0 -0
  113. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/de.json +0 -0
  114. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/el.json +0 -0
  115. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/en.json +0 -0
  116. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/es.json +0 -0
  117. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/eu.json +0 -0
  118. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/extract.py +0 -0
  119. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/fi.json +0 -0
  120. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/fr.json +0 -0
  121. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/he.json +0 -0
  122. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/hu.json +0 -0
  123. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/id.json +0 -0
  124. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/it.json +0 -0
  125. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/kk.json +0 -0
  126. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/ne.json +0 -0
  127. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/nl.json +0 -0
  128. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/no.json +0 -0
  129. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/pt.json +0 -0
  130. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/ro.json +0 -0
  131. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/ru.json +0 -0
  132. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/sl.json +0 -0
  133. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/sv.json +0 -0
  134. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/tg.json +0 -0
  135. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/stop_words/tr.json +0 -0
  136. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/tests/common/mod.rs +0 -0
  137. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_paragraph/tests/reader.rs +0 -0
  138. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_protos/Cargo.toml +0 -0
  139. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_protos/build.py +0 -0
  140. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_protos/build.rs +0 -0
  141. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_protos/nodereader.proto +0 -0
  142. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_protos/noderesources.proto +0 -0
  143. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_relation/Cargo.toml +0 -0
  144. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_relation/src/graph_collector.rs +0 -0
  145. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_relation/src/graph_query_parser.rs +0 -0
  146. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_relation/src/io_maps.rs +0 -0
  147. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_relation/src/lib.rs +0 -0
  148. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_relation/src/reader.rs +0 -0
  149. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_relation/src/resource_indexer.rs +0 -0
  150. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_relation/src/schema.rs +0 -0
  151. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_relation/src/top_unique_n.rs +0 -0
  152. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_relation/tests/common/mod.rs +0 -0
  153. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_relation/tests/test_graph_query_parser_search.rs +0 -0
  154. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_relation/tests/test_graph_search.rs +0 -0
  155. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_relation/tests/test_writer.rs +0 -0
  156. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_tantivy/Cargo.toml +0 -0
  157. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_tantivy/src/index_reader.rs +0 -0
  158. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_tantivy/src/lib.rs +0 -0
  159. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_tantivy/src/utils.rs +0 -0
  160. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_tests/Cargo.toml +0 -0
  161. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_tests/src/graph.rs +0 -0
  162. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_tests/src/lib.rs +0 -0
  163. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_text/Cargo.toml +0 -0
  164. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_text/src/lib.rs +0 -0
  165. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_text/src/prefilter.rs +0 -0
  166. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_text/src/query_io.rs +0 -0
  167. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_text/src/reader.rs +0 -0
  168. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_text/src/request_types.rs +0 -0
  169. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_text/src/resource_indexer.rs +0 -0
  170. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_text/src/schema.rs +0 -0
  171. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_text/src/search_query.rs +0 -0
  172. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_text/tests/common/mod.rs +0 -0
  173. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_text/tests/test_deletions.rs +0 -0
  174. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_text/tests/test_flow.rs +0 -0
  175. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_text/tests/test_search.rs +0 -0
  176. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_text/tests/test_streaming.rs +0 -0
  177. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_types/Cargo.toml +0 -0
  178. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_types/src/lib.rs +0 -0
  179. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_types/src/prefilter.rs +0 -0
  180. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_types/src/query_language.rs +0 -0
  181. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/Cargo.toml +0 -0
  182. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/config.rs +0 -0
  183. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/data_store/v1/node.rs +0 -0
  184. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/data_store/v1/store.rs +0 -0
  185. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/data_store/v1/trie.rs +0 -0
  186. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/data_store/v1/trie_ram.rs +0 -0
  187. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/data_store/v2.rs +0 -0
  188. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/data_types.rs +0 -0
  189. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/formula.rs +0 -0
  190. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/hnsw/disk_hnsw.rs +0 -0
  191. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/hnsw/ram_hnsw.rs +0 -0
  192. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/indexer.rs +0 -0
  193. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/lib.rs +0 -0
  194. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/multivector.rs +0 -0
  195. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/query_io.rs +0 -0
  196. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/request_types.rs +0 -0
  197. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/searcher.rs +0 -0
  198. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/segment/tests.rs +0 -0
  199. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/utils.rs +0 -0
  200. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/vector_types/dense_f32.rs +0 -0
  201. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/vector_types/mod.rs +0 -0
  202. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/src/vector_types/rabitq.rs +0 -0
  203. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/tests/common/mod.rs +0 -0
  204. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/tests/test_basic_search.rs +0 -0
  205. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/tests/test_hidden.rs +0 -0
  206. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/nidx_vector/tests/test_maxsim.rs +0 -0
  207. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/api/shards.rs +0 -0
  208. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/api.rs +0 -0
  209. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/control.rs +0 -0
  210. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/errors.rs +0 -0
  211. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/grpc_server.rs +0 -0
  212. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/import_export.rs +0 -0
  213. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/indexer.rs +0 -0
  214. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/lib.rs +0 -0
  215. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/main.rs +0 -0
  216. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/metadata/deletion.rs +0 -0
  217. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/metadata/index.rs +0 -0
  218. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/metadata/index_request.rs +0 -0
  219. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/metadata/merge_job.rs +0 -0
  220. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/metadata/segment.rs +0 -0
  221. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/metadata/shard.rs +0 -0
  222. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/metadata.rs +0 -0
  223. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/metrics.rs +0 -0
  224. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/scheduler/audit_task.rs +0 -0
  225. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/scheduler/log_merge.rs +0 -0
  226. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/scheduler/merge_task.rs +0 -0
  227. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/scheduler/metrics_task.rs +0 -0
  228. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/scheduler/purge_tasks.rs +0 -0
  229. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/scheduler/vector_merge.rs +0 -0
  230. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/scheduler.rs +0 -0
  231. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/searcher/grpc.rs +0 -0
  232. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/searcher/index_cache.rs +0 -0
  233. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/searcher/query_language.rs +0 -0
  234. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/searcher/query_planner.rs +0 -0
  235. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/searcher/shard_search.rs +0 -0
  236. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/searcher/shard_selector.rs +0 -0
  237. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/searcher/shard_suggest.rs +0 -0
  238. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/searcher/streams.rs +0 -0
  239. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/searcher/sync.rs +0 -0
  240. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/searcher.rs +0 -0
  241. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/segment_store.rs +0 -0
  242. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/settings.rs +0 -0
  243. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/telemetry/duration_layer.rs +0 -0
  244. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/telemetry/log_format.rs +0 -0
  245. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/telemetry/middleware.rs +0 -0
  246. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/telemetry.rs +0 -0
  247. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/tool.rs +0 -0
  248. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/utilization_tracker.rs +0 -0
  249. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/src/worker.rs +0 -0
  250. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/tests/common/mod.rs +0 -0
  251. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/tests/common/services.rs +0 -0
  252. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/tests/test_date_range_search.rs +0 -0
  253. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/tests/test_search_filtering.rs +0 -0
  254. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/tests/test_search_relations.rs +0 -0
  255. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/tests/test_search_sorting.rs +0 -0
  256. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/tests/test_searcher_cluster.rs +0 -0
  257. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/tests/test_security_search.rs +0 -0
  258. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/tests/test_shards.rs +0 -0
  259. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/tests/test_shards_api.rs +0 -0
  260. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/tests/test_suggest.rs +0 -0
  261. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/tests/test_synced_searcher.rs +0 -0
  262. {nidx_binding-6.9.1.post600 → nidx_binding-6.9.1.post616}/tests/test_vector_normalization.rs +0 -0
  263. {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.post600
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
+ }
@@ -64,6 +64,7 @@ message NewShardRequest {
64
64
  bool normalize_vectors = 4 [deprecated = true];
65
65
  VectorIndexConfig config = 5 [deprecated = true];
66
66
  map<string, VectorIndexConfig> vectorsets_configs = 6;
67
+ bool prewarm_enabled = 7;
67
68
 
68
69
  }
69
70
 
@@ -10,7 +10,7 @@ build-backend = "pdm.backend"
10
10
 
11
11
  [project]
12
12
  name = "nidx_protos"
13
- version = "6.9.1.post600"
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" }]
@@ -42,6 +42,7 @@ pub mod kb_usage {
42
42
  tonic::include_proto!("kb_usage");
43
43
  }
44
44
 
45
+ pub use nidx::*;
45
46
  pub use nodereader::*;
46
47
  pub use noderesources::*;
47
48
  pub use nodewriter::*;
@@ -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 data = unsafe { Mmap::map(&File::open(path.join(FILENAME))?)? };
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
  }
@@ -60,7 +60,7 @@ impl VectorStore {
60
60
  {
61
61
  let advice = match reason {
62
62
  OpenReason::Create => memmap2::Advice::Sequential,
63
- OpenReason::Search => memmap2::Advice::Random,
63
+ OpenReason::Search { .. } => memmap2::Advice::Random,
64
64
  };
65
65
  data.advise(advice)?;
66
66
  }
@@ -31,7 +31,7 @@ use v2::StoredParagraph;
31
31
  use crate::{ParagraphAddr, VectorAddr, vector_types::rabitq};
32
32
 
33
33
  pub enum OpenReason {
34
- Search,
34
+ Search { prewarm: bool },
35
35
  Create,
36
36
  }
37
37
 
@@ -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, DR> {
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<DR: DataRetriever> NodeFilter<'_, DR> {
147
- pub fn passes_formula(&self, n: ParagraphAddr) -> bool {
148
- self.filter.contains(n)
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 is_valid(&self, n: VectorAddr, score: f32) -> bool {
152
- !score.is_nan()
153
- // Reject the candidate if we already have a result for the same paragraph
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
- /// Adds a result so that further candidates with the same vector
160
- /// or paragraph will get rejected.
161
- pub fn add_result(&mut self, n: VectorAddr) {
162
- self.paragraphs.insert(self.retriever.paragraph(n));
163
- self.vec_counter.add(self.retriever.get_vector(n));
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, DR>,
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
- let paragraph_addr = self.retriever.paragraph(candidate);
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.into_iter().map(|Reverse(CnxWithBound(n, d))| (n, d))
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
- with_filter: &FilterBitSet,
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
- k_neighbours
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
- layer_zero,
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 searched for before adding a new embedding.
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>) -> VectorR<Self> {
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 { Mmap::map(&File::open(path)?)? })?,
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);
@@ -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 { Mmap::map(&File::open(path)?)? },
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(&work_path.join(file::INDEX_MAP))?);
171
- let field_index = FstIndexReader::open(&work_path.join(file::FIELD_INDEX), map.clone())?;
172
- let label_index = FstIndexReader::open(&work_path.join(file::LABEL_INDEX), map)?;
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 index = unsafe { Mmap::map(&hnsw_file)? };
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(segment_path, merged_vectors_count as usize)?;
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(path, vector_count as usize)?;
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 neighbours = ops.search(encoded_query, self.index.as_ref(), top_k, bitset, with_duplicates);
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.post600"
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 {