nidx-binding 6.9.1.post596__tar.gz → 6.9.1.post603__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.post596 → nidx_binding-6.9.1.post603}/PKG-INFO +1 -1
  2. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_protos/nidx.proto +15 -1
  3. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_protos/nodewriter.proto +1 -0
  4. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_protos/pyproject.toml +1 -1
  5. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_protos/src/lib.rs +1 -0
  6. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_vector/src/data_store/v1.rs +1 -1
  7. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_vector/src/data_store/v2/paragraph_store.rs +13 -9
  8. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_vector/src/data_store/v2/quant_vector_store.rs +16 -8
  9. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_vector/src/data_store/v2/vector_store.rs +6 -6
  10. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_vector/src/data_store/v2.rs +1 -1
  11. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_vector/src/data_store.rs +1 -1
  12. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_vector/src/inverted_index/fst_index.rs +10 -5
  13. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_vector/src/inverted_index/map.rs +9 -4
  14. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_vector/src/inverted_index.rs +11 -4
  15. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_vector/src/searcher.rs +20 -33
  16. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_vector/src/segment.rs +24 -11
  17. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/pyproject.toml +1 -1
  18. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/api/grpc.rs +6 -2
  19. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/segment_store.rs +1 -0
  20. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.config/nextest.toml +0 -0
  21. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-0cfce9b29547f8f5bafa6e440f86103be7b8c4ad2fd92db9ac223f4efbe23d10.json +0 -0
  22. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-1a561eed00f3dbe868bf5030059793300209179dc8fb73e4b57a54b5e81262fe.json +0 -0
  23. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-1d3fca2682e25a01143da92285297f134a6a105a96f64d87e0db3abb219855e4.json +0 -0
  24. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-249b3b57c27a71baa823f1fe0f0bba9c9af36f61c28f731e58beea60ec48e687.json +0 -0
  25. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-24cb6b683daa42d7125f862e25943ab4be7bf275cd8739f8da4859d701795e1a.json +0 -0
  26. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-263c8fce6db5b03bbd012fafdba6943cbee6ed7eb8976cdef4f5b01dde7ca6fd.json +0 -0
  27. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-2a5d92fb1638df830a4477a7cdf24e6db6b43034b7bbe74fdfb63e8afe2c4071.json +0 -0
  28. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-2b065a363f58caed60e3706603c1260dbf5a4c795604a5b68edda22eb07fec1b.json +0 -0
  29. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-3fc3cb39934683de8cd475ce1368c8373453eb1e01f81587d66b9d14b109ce6e.json +0 -0
  30. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-48f33b77b7c1633467b0b2efcaa1d3c207e7757e4f1d83b40d15e6ca365f7771.json +0 -0
  31. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-4ae09f2c08e2f324bee01bb8487a8f37678a1c5e9d327339235c50d4921a8949.json +0 -0
  32. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-4d7a76fa413c9ef0ce2a47ac7bb7e01d3e6a2aabded9487d21010a53efee8852.json +0 -0
  33. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-4fcbdd6657c7dc9b60b3a563dd41711b3dbcf72ce063427b7a01f8cddf34c244.json +0 -0
  34. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-577109ac00ccfbd38ecaccab94116f2f46a4caf5612afa372cded197123c1e08.json +0 -0
  35. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-5db25f97d8578d6d78f2f6bd4b72cc82a9b1b82805c6422d967ac63b20d99db4.json +0 -0
  36. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-5ec3233a3a23e926055056d46bdde17836a633066dbb5f349502648cd3ea9a60.json +0 -0
  37. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-66edb6ea424d8681927dcddb6bac5f1239175f4775d1f40417ba15054b0c6f19.json +0 -0
  38. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-6f9c6d201c1b5712efb68c363bffd3e0169c11f2a8f925e8cd4e8808599ff7b4.json +0 -0
  39. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-733c3ebacc86f444bf5e2dd79ade660c291e88a00fc09b722f6e2e191545874c.json +0 -0
  40. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-7a3bf27c330c468a596e8a297cf7d8b192e31e67ecc5177c1267f579e8e247c7.json +0 -0
  41. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-7a7e59e47b30b12237511fd3d7da2d17b0471ad2b006af48d6a6f587c779692b.json +0 -0
  42. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-7dcbb33312cc9f11ae3a6d73b1ace017a9f19a8bf8f10304fc57977c8efeadff.json +0 -0
  43. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-7efa7c0d747afc4b6aed0586ff846c27839c3213ff7ee9f30c89b0d0f17e60e3.json +0 -0
  44. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-8493140d788604d498a4e48da4158708572ccc9d60185290a00d549cc84533db.json +0 -0
  45. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-8493bb0059b013eaca42fd10cd7d04f0d06a8acaed379eff0d23f3229edde9ee.json +0 -0
  46. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-87996b3d6c7a2195438d7038015b06949102bce8c7b8cd8db1f83aaf23cbe489.json +0 -0
  47. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-8d33717587c6ee8f5fc339a80b1212a73d6c03e45856b1d55457fc8074709dd0.json +0 -0
  48. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-8f096d8171b89f9615d18f95d696dc9e4fb3674e103161a713cdc806f7a68506.json +0 -0
  49. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-917732a56ee04bf3a6e127319dda8225210869c82f9828d878162394dba4e078.json +0 -0
  50. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-95fe4ef93ee90733db1b67ed7987f80b5aac792f1590b979c68b418d1599eb98.json +0 -0
  51. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-9b67658569b343d8b4b61ae0a7dc721f367f2ba33c7b69b9e68bfd5c9bff5206.json +0 -0
  52. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-9c8062ea55d070afef68309e58fa987eb37fda44e1efbf68c8ba2af7846cc968.json +0 -0
  53. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-a06e1d9f6f95e4c4c2b98310ebddcc9d963cc033582bf2e945e8bf3a301b4247.json +0 -0
  54. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-a55265c9b07bd1399961a6f1e757201fd0eebe868ddaf96437111113d80fce92.json +0 -0
  55. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-a60ec2f66f1e7b84189e5b089f2087a29ff6a64326a3743dea935bbc58ee77fa.json +0 -0
  56. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-a891a37be5c2d7cce775c2dd33726b0318fd3839beab222a1b22bc6174604207.json +0 -0
  57. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-a945191bb4b3e37d6823ed3ad499339d007d69983105de8567777d9daf517b28.json +0 -0
  58. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-abe9f7832f2bd799ac44008da031e8d8ab52d4f5fbfc2a7e3974e8873bae55b2.json +0 -0
  59. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-aca588cca57a85e4d7fcc40c23cd87e57d53d11ca550d78e7e3d5e39e524fcd3.json +0 -0
  60. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-b02f8aafc00a7724510772ac41269e368c5bccf03ef7b4590e0ef6fd1a1bf64f.json +0 -0
  61. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-b742e17cabe2d64617e9aa64bafc782172f7a4f8023d1b54f952a0fb39f6b2b8.json +0 -0
  62. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-b94e349dbc0daec57f8f8f6e9e2dffb06100b1bb2b41d297c9f3b191da37a83d.json +0 -0
  63. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-bd9afa22994aba671dbf7b5f89b53c2ee02f53c0442a81265786a6d52d08512f.json +0 -0
  64. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-be60554eca98a5899efc6b49785cecd6444a6d39afed9e4a884ce2dbf162012c.json +0 -0
  65. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-bf49702b506c9a1650ece1f8e8d9f14834a902f8caefafe30ded55e2790f2188.json +0 -0
  66. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-bfcd21ed704cd305db5c17fcdec7d92aa4ac501913c9c9514d8ff92928c0c7e7.json +0 -0
  67. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-c3ab694650f49a75b146fb877a92e48c4f20f0d99f70f8ec859fbb763b01a1e5.json +0 -0
  68. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-c55542bb9fae544d87fae6f30e0fe8a9088d12075f4442ab4fe2fcd05e472234.json +0 -0
  69. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-cb29a6556d35ac630ee0aa885dd7341cf9573bd3efd216ff8a887b87686b03db.json +0 -0
  70. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-d0a1f341a89f5f14696b10baa72db9d95551c2b7e5fc67308fd52dc03dd98a92.json +0 -0
  71. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-d2ad0a0ca2649c9e4873cfcc1fc66d2d07cc45d0f65c560b06d7b5f592f4fa8a.json +0 -0
  72. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-d6cfe78eb635ba0b89ca4021a4dc8182d18ab5b197f30149cd28488eba4c1df5.json +0 -0
  73. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-d729b56dea00e49dcdba8cf0001e2811da27351eabe98212db3b589f18fc6f32.json +0 -0
  74. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-d9658bfd4e7170b41d03f2ddf2446d0bf54171c0d39d53bf20af2b8437f2ec48.json +0 -0
  75. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-dbba7b3d3289425bae711aedbf73fbc3699f857f86f84d95c3b556d05c5658b0.json +0 -0
  76. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-dcb96b649d6d63a58efd5d445453a4f3d7869a56ff714b69bedf3d616a0473ca.json +0 -0
  77. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-ebd876fbf5362a5900e75bc05f2f11c73c406ef7da4e95097fc6a1c3d1b8bc54.json +0 -0
  78. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-eef5cc6bce1cc14eba8f3e68971724ef181e88cffcedd74673615f2026b89a62.json +0 -0
  79. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/.sqlx/query-ef56d5fefc5774040d1ee397beadb475f6af02768c22f0e583c74062e2e821ce.json +0 -0
  80. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/Cargo.lock +0 -0
  81. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/Cargo.toml +0 -0
  82. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/README.md +0 -0
  83. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/migrations/20241007163501_initial.sql +0 -0
  84. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/migrations/20241211120039_merge_job_priority.sql +0 -0
  85. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/migrations/20241211121159_basic_indexes.sql +0 -0
  86. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/migrations/20241212151105_check_segment_records.sql +0 -0
  87. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/migrations/20250110145554_in_flight_messages.sql +0 -0
  88. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_binding/Cargo.toml +0 -0
  89. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_binding/src/lib.rs +0 -0
  90. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/Cargo.toml +0 -0
  91. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/src/fuzzy_query.rs +0 -0
  92. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/src/lib.rs +0 -0
  93. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/src/query_io.rs +0 -0
  94. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/src/query_parser/fuzzy_parser.rs +0 -0
  95. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/src/query_parser/keyword_parser.rs +0 -0
  96. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/src/query_parser/stop_words.rs +0 -0
  97. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/src/query_parser/tokenizer.rs +0 -0
  98. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/src/query_parser.rs +0 -0
  99. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/src/reader.rs +0 -0
  100. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/src/request_types.rs +0 -0
  101. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/src/resource_indexer.rs +0 -0
  102. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/src/schema.rs +0 -0
  103. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/src/search_query.rs +0 -0
  104. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/src/search_response.rs +0 -0
  105. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/src/set_query.rs +0 -0
  106. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/stop_words/README.md +0 -0
  107. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/stop_words/ar.json +0 -0
  108. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/stop_words/az.json +0 -0
  109. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/stop_words/bn.json +0 -0
  110. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/stop_words/ca.json +0 -0
  111. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/stop_words/ch.json +0 -0
  112. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/stop_words/da.json +0 -0
  113. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/stop_words/de.json +0 -0
  114. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/stop_words/el.json +0 -0
  115. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/stop_words/en.json +0 -0
  116. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/stop_words/es.json +0 -0
  117. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/stop_words/eu.json +0 -0
  118. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/stop_words/extract.py +0 -0
  119. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/stop_words/fi.json +0 -0
  120. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/stop_words/fr.json +0 -0
  121. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/stop_words/he.json +0 -0
  122. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/stop_words/hu.json +0 -0
  123. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/stop_words/id.json +0 -0
  124. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/stop_words/it.json +0 -0
  125. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/stop_words/kk.json +0 -0
  126. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/stop_words/ne.json +0 -0
  127. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/stop_words/nl.json +0 -0
  128. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/stop_words/no.json +0 -0
  129. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/stop_words/pt.json +0 -0
  130. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/stop_words/ro.json +0 -0
  131. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/stop_words/ru.json +0 -0
  132. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/stop_words/sl.json +0 -0
  133. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/stop_words/sv.json +0 -0
  134. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/stop_words/tg.json +0 -0
  135. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/stop_words/tr.json +0 -0
  136. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/tests/common/mod.rs +0 -0
  137. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_paragraph/tests/reader.rs +0 -0
  138. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_protos/Cargo.toml +0 -0
  139. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_protos/build.py +0 -0
  140. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_protos/build.rs +0 -0
  141. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_protos/nodereader.proto +0 -0
  142. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_protos/noderesources.proto +0 -0
  143. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_relation/Cargo.toml +0 -0
  144. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_relation/src/graph_collector.rs +0 -0
  145. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_relation/src/graph_query_parser.rs +0 -0
  146. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_relation/src/io_maps.rs +0 -0
  147. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_relation/src/lib.rs +0 -0
  148. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_relation/src/reader.rs +0 -0
  149. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_relation/src/resource_indexer.rs +0 -0
  150. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_relation/src/schema.rs +0 -0
  151. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_relation/src/top_unique_n.rs +0 -0
  152. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_relation/tests/common/mod.rs +0 -0
  153. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_relation/tests/test_graph_query_parser_search.rs +0 -0
  154. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_relation/tests/test_graph_search.rs +0 -0
  155. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_relation/tests/test_writer.rs +0 -0
  156. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_tantivy/Cargo.toml +0 -0
  157. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_tantivy/src/index_reader.rs +0 -0
  158. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_tantivy/src/lib.rs +0 -0
  159. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_tantivy/src/utils.rs +0 -0
  160. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_tests/Cargo.toml +0 -0
  161. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_tests/src/graph.rs +0 -0
  162. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_tests/src/lib.rs +0 -0
  163. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_text/Cargo.toml +0 -0
  164. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_text/src/lib.rs +0 -0
  165. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_text/src/prefilter.rs +0 -0
  166. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_text/src/query_io.rs +0 -0
  167. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_text/src/reader.rs +0 -0
  168. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_text/src/request_types.rs +0 -0
  169. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_text/src/resource_indexer.rs +0 -0
  170. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_text/src/schema.rs +0 -0
  171. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_text/src/search_query.rs +0 -0
  172. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_text/tests/common/mod.rs +0 -0
  173. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_text/tests/test_deletions.rs +0 -0
  174. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_text/tests/test_flow.rs +0 -0
  175. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_text/tests/test_search.rs +0 -0
  176. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_text/tests/test_streaming.rs +0 -0
  177. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_types/Cargo.toml +0 -0
  178. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_types/src/lib.rs +0 -0
  179. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_types/src/prefilter.rs +0 -0
  180. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_types/src/query_language.rs +0 -0
  181. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_vector/Cargo.toml +0 -0
  182. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_vector/src/config.rs +0 -0
  183. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_vector/src/data_store/v1/node.rs +0 -0
  184. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_vector/src/data_store/v1/store.rs +0 -0
  185. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_vector/src/data_store/v1/trie.rs +0 -0
  186. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_vector/src/data_store/v1/trie_ram.rs +0 -0
  187. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_vector/src/data_types.rs +0 -0
  188. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_vector/src/formula.rs +0 -0
  189. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_vector/src/hnsw/disk_hnsw.rs +0 -0
  190. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_vector/src/hnsw/ops_hnsw.rs +0 -0
  191. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_vector/src/hnsw/params.rs +0 -0
  192. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_vector/src/hnsw/ram_hnsw.rs +0 -0
  193. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_vector/src/hnsw.rs +0 -0
  194. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_vector/src/indexer.rs +0 -0
  195. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_vector/src/lib.rs +0 -0
  196. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_vector/src/multivector.rs +0 -0
  197. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_vector/src/query_io.rs +0 -0
  198. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_vector/src/request_types.rs +0 -0
  199. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_vector/src/segment/tests.rs +0 -0
  200. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_vector/src/utils.rs +0 -0
  201. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_vector/src/vector_types/dense_f32.rs +0 -0
  202. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_vector/src/vector_types/mod.rs +0 -0
  203. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_vector/src/vector_types/rabitq.rs +0 -0
  204. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_vector/tests/common/mod.rs +0 -0
  205. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_vector/tests/test_basic_search.rs +0 -0
  206. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_vector/tests/test_hidden.rs +0 -0
  207. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/nidx_vector/tests/test_maxsim.rs +0 -0
  208. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/api/shards.rs +0 -0
  209. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/api.rs +0 -0
  210. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/control.rs +0 -0
  211. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/errors.rs +0 -0
  212. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/grpc_server.rs +0 -0
  213. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/import_export.rs +0 -0
  214. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/indexer.rs +0 -0
  215. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/lib.rs +0 -0
  216. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/main.rs +0 -0
  217. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/metadata/deletion.rs +0 -0
  218. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/metadata/index.rs +0 -0
  219. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/metadata/index_request.rs +0 -0
  220. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/metadata/merge_job.rs +0 -0
  221. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/metadata/segment.rs +0 -0
  222. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/metadata/shard.rs +0 -0
  223. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/metadata.rs +0 -0
  224. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/metrics.rs +0 -0
  225. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/scheduler/audit_task.rs +0 -0
  226. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/scheduler/log_merge.rs +0 -0
  227. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/scheduler/merge_task.rs +0 -0
  228. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/scheduler/metrics_task.rs +0 -0
  229. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/scheduler/purge_tasks.rs +0 -0
  230. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/scheduler/vector_merge.rs +0 -0
  231. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/scheduler.rs +0 -0
  232. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/searcher/grpc.rs +0 -0
  233. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/searcher/index_cache.rs +0 -0
  234. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/searcher/query_language.rs +0 -0
  235. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/searcher/query_planner.rs +0 -0
  236. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/searcher/shard_search.rs +0 -0
  237. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/searcher/shard_selector.rs +0 -0
  238. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/searcher/shard_suggest.rs +0 -0
  239. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/searcher/streams.rs +0 -0
  240. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/searcher/sync.rs +0 -0
  241. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/searcher.rs +0 -0
  242. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/settings.rs +0 -0
  243. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/telemetry/duration_layer.rs +0 -0
  244. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/telemetry/log_format.rs +0 -0
  245. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/telemetry/middleware.rs +0 -0
  246. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/telemetry.rs +0 -0
  247. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/tool.rs +0 -0
  248. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/utilization_tracker.rs +0 -0
  249. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/src/worker.rs +0 -0
  250. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/tests/common/mod.rs +0 -0
  251. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/tests/common/services.rs +0 -0
  252. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/tests/test_date_range_search.rs +0 -0
  253. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/tests/test_search_filtering.rs +0 -0
  254. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/tests/test_search_relations.rs +0 -0
  255. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/tests/test_search_sorting.rs +0 -0
  256. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/tests/test_searcher_cluster.rs +0 -0
  257. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/tests/test_security_search.rs +0 -0
  258. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/tests/test_shards.rs +0 -0
  259. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/tests/test_shards_api.rs +0 -0
  260. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/tests/test_suggest.rs +0 -0
  261. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/tests/test_synced_searcher.rs +0 -0
  262. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/tests/test_vector_normalization.rs +0 -0
  263. {nidx_binding-6.9.1.post596 → nidx_binding-6.9.1.post603}/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.post596
3
+ Version: 6.9.1.post603
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.post596"
13
+ version = "6.9.1.post603"
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
  }
@@ -19,7 +19,11 @@
19
19
  //
20
20
 
21
21
  use memmap2::Mmap;
22
- use std::{fs::File, io::Write as _, path::Path};
22
+ use std::{
23
+ fs::File,
24
+ io::{BufWriter, Write as _},
25
+ path::Path,
26
+ };
23
27
 
24
28
  use crate::{
25
29
  VectorR,
@@ -86,7 +90,7 @@ impl ParagraphStore {
86
90
  pos.advise(memmap2::Advice::WillNeed)?;
87
91
  let advice = match reason {
88
92
  OpenReason::Create => memmap2::Advice::Sequential,
89
- OpenReason::Search => memmap2::Advice::Random,
93
+ OpenReason::Search { .. } => memmap2::Advice::Random,
90
94
  };
91
95
  data.advise(advice)?;
92
96
  }
@@ -112,8 +116,8 @@ impl ParagraphStore {
112
116
  }
113
117
 
114
118
  pub struct ParagraphStoreWriter {
115
- data: File,
116
- pos: File,
119
+ data: BufWriter<File>,
120
+ pos: BufWriter<File>,
117
121
  data_pos: u32,
118
122
  addr: u32,
119
123
  }
@@ -121,8 +125,8 @@ pub struct ParagraphStoreWriter {
121
125
  impl ParagraphStoreWriter {
122
126
  pub fn new(path: &Path) -> std::io::Result<Self> {
123
127
  Ok(Self {
124
- pos: File::create(path.join(FILENAME_POS))?,
125
- data: File::create(path.join(FILENAME_DATA))?,
128
+ pos: BufWriter::new(File::create(path.join(FILENAME_POS))?),
129
+ data: BufWriter::new(File::create(path.join(FILENAME_DATA))?),
126
130
  data_pos: 0,
127
131
  addr: 0,
128
132
  })
@@ -159,9 +163,9 @@ impl ParagraphStoreWriter {
159
163
  Ok(self.addr)
160
164
  }
161
165
 
162
- pub fn close(self) -> std::io::Result<()> {
163
- self.data.sync_all()?;
164
- self.pos.sync_all()?;
166
+ pub fn close(&mut self) -> std::io::Result<()> {
167
+ self.data.flush()?;
168
+ self.pos.flush()?;
165
169
  Ok(())
166
170
  }
167
171
  }
@@ -19,8 +19,12 @@
19
19
  //
20
20
 
21
21
  use lazy_static::lazy_static;
22
- use memmap2::Mmap;
23
- use std::{fs::File, io::Write as _, path::Path};
22
+ use memmap2::{Mmap, MmapOptions};
23
+ use std::{
24
+ fs::File,
25
+ io::{BufWriter, Write as _},
26
+ path::Path,
27
+ };
24
28
 
25
29
  use crate::{
26
30
  data_store::{OpenReason, VectorAddr},
@@ -37,13 +41,17 @@ pub struct QuantVectorStore {
37
41
 
38
42
  impl QuantVectorStore {
39
43
  pub fn open(path: &Path, vector_len_bytes: usize, reason: &OpenReason) -> std::io::Result<Self> {
40
- 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))?)? };
41
49
 
42
50
  #[cfg(not(target_os = "windows"))]
43
51
  {
44
52
  let advice = match reason {
45
53
  OpenReason::Create => memmap2::Advice::Sequential,
46
- OpenReason::Search => memmap2::Advice::Random,
54
+ OpenReason::Search { .. } => memmap2::Advice::Random,
47
55
  };
48
56
  data.advise(advice)?;
49
57
  }
@@ -86,13 +94,13 @@ impl QuantVectorStore {
86
94
  }
87
95
 
88
96
  pub struct QuantVectorStoreWriter {
89
- output: File,
97
+ output: BufWriter<File>,
90
98
  }
91
99
 
92
100
  impl QuantVectorStoreWriter {
93
101
  pub fn new(path: &Path) -> std::io::Result<Self> {
94
102
  Ok(Self {
95
- output: File::create(path.join(FILENAME))?,
103
+ output: BufWriter::new(File::create(path.join(FILENAME))?),
96
104
  })
97
105
  }
98
106
 
@@ -100,7 +108,7 @@ impl QuantVectorStoreWriter {
100
108
  self.output.write_all(vector)
101
109
  }
102
110
 
103
- pub fn close(self) -> std::io::Result<()> {
104
- self.output.sync_all()
111
+ pub fn close(&mut self) -> std::io::Result<()> {
112
+ self.output.flush()
105
113
  }
106
114
  }
@@ -22,7 +22,7 @@ use lazy_static::lazy_static;
22
22
  use memmap2::Mmap;
23
23
  use std::{
24
24
  fs::File,
25
- io::{Seek, SeekFrom, Write as _},
25
+ io::{BufWriter, Seek, SeekFrom, Write as _},
26
26
  path::Path,
27
27
  };
28
28
 
@@ -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
  }
@@ -119,7 +119,7 @@ impl VectorStore {
119
119
  }
120
120
 
121
121
  pub struct VectorStoreWriter {
122
- output: File,
122
+ output: BufWriter<File>,
123
123
  addr: u32,
124
124
  padding_bytes: usize,
125
125
  }
@@ -127,7 +127,7 @@ pub struct VectorStoreWriter {
127
127
  impl VectorStoreWriter {
128
128
  pub fn new(path: &Path, vector_type: &VectorType) -> std::io::Result<Self> {
129
129
  Ok(Self {
130
- output: File::create(path.join(FILENAME))?,
130
+ output: BufWriter::new(File::create(path.join(FILENAME))?),
131
131
  addr: 0,
132
132
  padding_bytes: padding_bytes(vector_type),
133
133
  })
@@ -151,7 +151,7 @@ impl VectorStoreWriter {
151
151
  Ok((first_addr, last_addr))
152
152
  }
153
153
 
154
- pub fn close(self) -> std::io::Result<()> {
155
- self.output.sync_all()
154
+ pub fn close(mut self) -> std::io::Result<()> {
155
+ self.output.flush()
156
156
  }
157
157
  }
@@ -77,7 +77,7 @@ impl DataStoreV2 {
77
77
 
78
78
  paragraphs.close()?;
79
79
  vectors.close()?;
80
- if let Some(quantized) = quantized {
80
+ if let Some(mut quantized) = quantized {
81
81
  quantized.close()?;
82
82
  }
83
83
 
@@ -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
 
@@ -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,
@@ -156,10 +156,11 @@ impl<'a> Fssc<'a> {
156
156
  buff: HashSet::with_capacity(size),
157
157
  }
158
158
  }
159
- fn add(&mut self, candidate: ScoredParagraph<'a>, vector: Vec<u8>) {
160
- if !self.with_duplicates && self.seen.contains(&vector) {
159
+ fn add(&mut self, candidate: ScoredParagraph<'a>, vector: &[u8]) {
160
+ if !self.with_duplicates && self.seen.contains(vector) {
161
161
  return;
162
162
  } else if !self.with_duplicates {
163
+ let vector = vector.to_vec();
163
164
  self.seen.insert(vector);
164
165
  }
165
166
 
@@ -260,37 +261,23 @@ impl Searcher {
260
261
  let min_score = request.min_score();
261
262
  let mut ffsv = Fssc::new(request.no_results(), with_duplicates);
262
263
 
263
- let pool = rayon::ThreadPoolBuilder::new().build().unwrap();
264
- let results: Vec<_> = pool.install(|| {
265
- self.open_segments
266
- .par_iter()
267
- .flat_map(|open_segment| {
268
- // Skip this segment if it doesn't match the segment filter
269
- if !segment_filter
270
- .as_ref()
271
- .is_none_or(|f| segment_matches(f, open_segment.tags()))
272
- {
273
- return vec![];
274
- }
275
- let partial_solution =
276
- open_segment.search(query, filter, with_duplicates, no_results, &self.config, min_score);
277
-
278
- partial_solution
279
- .map(|candidate| {
280
- let addr = candidate.paragraph();
281
- let paragraph = open_segment.get_paragraph(addr);
282
- (
283
- ScoredParagraph::new(open_segment, addr, paragraph, candidate.score()),
284
- candidate.vector().to_vec(),
285
- )
286
- })
287
- .collect()
288
- })
289
- .collect()
290
- });
291
-
292
- for (paragraph, vector) in results {
293
- ffsv.add(paragraph, vector);
264
+ for open_segment in &self.open_segments {
265
+ // Skip this segment if it doesn't match the segment filter
266
+ if !segment_filter
267
+ .as_ref()
268
+ .is_none_or(|f| segment_matches(f, open_segment.tags()))
269
+ {
270
+ continue;
271
+ }
272
+ let partial_solution =
273
+ open_segment.search(query, filter, with_duplicates, no_results, &self.config, min_score);
274
+
275
+ for candidate in partial_solution {
276
+ let addr = candidate.paragraph();
277
+ let paragraph = open_segment.get_paragraph(addr);
278
+ let scored_paragraph = ScoredParagraph::new(open_segment, addr, paragraph, candidate.score());
279
+ ffsv.add(scored_paragraph, candidate.vector());
280
+ }
294
281
  }
295
282
 
296
283
  Ok(ffsv.into())
@@ -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 {
@@ -180,8 +187,6 @@ fn merge_indexes<DS: DataStore + 'static>(
180
187
  index.advise(memmap2::Advice::Random)?;
181
188
  }
182
189
 
183
- build_indexes(segment_path, &data_store)?;
184
-
185
190
  let metadata = VectorSegmentMetadata {
186
191
  path: segment_path.to_path_buf(),
187
192
  records: data_store.stored_paragraph_count() as usize,
@@ -191,7 +196,11 @@ fn merge_indexes<DS: DataStore + 'static>(
191
196
  };
192
197
 
193
198
  build_indexes(segment_path, &data_store)?;
194
- 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
+ )?;
195
204
  let alive_bitset = FilterBitSet::new(metadata.records, true);
196
205
 
197
206
  Ok(OpenSegment {
@@ -291,7 +300,11 @@ fn create_indexes<DS: DataStore + 'static>(
291
300
  };
292
301
 
293
302
  build_indexes(path, &data_store)?;
294
- 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
+ )?;
295
308
  let alive_bitset = FilterBitSet::new(metadata.records, true);
296
309
 
297
310
  Ok(OpenSegment {
@@ -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.post596"
16
+ version = "6.9.1.post603"
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 {
@@ -107,6 +107,7 @@ pub async fn download_segment(
107
107
 
108
108
  let temp_dir2 = temp_dir.clone();
109
109
  let mut tar = tar::Archive::new(reader);
110
+ tar.set_preserve_mtime(false); // We don't care about metadata and we can save a few syscalls
110
111
  let result = tokio::task::spawn_blocking(move || tar.unpack(temp_dir2)).await?;
111
112
 
112
113
  if let Err(e) = result {