vectordb-bench 0.0.27__tar.gz → 0.0.29__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 (184) hide show
  1. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/PKG-INFO +16 -8
  2. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/README.md +12 -7
  3. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/pyproject.toml +2 -0
  4. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/__init__.py +3 -1
  5. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/__init__.py +18 -2
  6. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/api.py +1 -0
  7. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/clickhouse/cli.py +1 -0
  8. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/clickhouse/clickhouse.py +3 -3
  9. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/clickhouse/config.py +2 -2
  10. vectordb_bench-0.0.29/vectordb_bench/backend/clients/lancedb/cli.py +92 -0
  11. vectordb_bench-0.0.29/vectordb_bench/backend/clients/lancedb/config.py +103 -0
  12. vectordb_bench-0.0.29/vectordb_bench/backend/clients/lancedb/lancedb.py +97 -0
  13. vectordb_bench-0.0.29/vectordb_bench/backend/clients/qdrant_cloud/cli.py +43 -0
  14. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/qdrant_cloud/config.py +4 -4
  15. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/runner/mp_runner.py +16 -5
  16. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/task_runner.py +1 -0
  17. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/cli/cli.py +16 -3
  18. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/cli/vectordbbench.py +4 -0
  19. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/frontend/components/run_test/dbConfigSetting.py +10 -4
  20. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/frontend/config/dbCaseConfigs.py +125 -0
  21. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/frontend/config/styles.py +1 -0
  22. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/models.py +21 -5
  23. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench.egg-info/PKG-INFO +16 -8
  24. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench.egg-info/SOURCES.txt +4 -0
  25. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench.egg-info/requires.txt +4 -0
  26. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/.devcontainer/Dockerfile +0 -0
  27. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/.devcontainer/devcontainer.json +0 -0
  28. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/.env.example +0 -0
  29. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/.github/workflows/publish_package_on_release.yml +0 -0
  30. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/.github/workflows/pull_request.yml +0 -0
  31. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/.gitignore +0 -0
  32. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/Dockerfile +0 -0
  33. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/LICENSE +0 -0
  34. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/Makefile +0 -0
  35. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/OWNERS +0 -0
  36. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/fig/custom_case_run_test.png +0 -0
  37. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/fig/custom_dataset.png +0 -0
  38. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/install/requirements_py3.11.txt +0 -0
  39. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/install.py +0 -0
  40. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/setup.cfg +0 -0
  41. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/tests/conftest.py +0 -0
  42. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/tests/pytest.ini +0 -0
  43. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/tests/test_bench_runner.py +0 -0
  44. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/tests/test_chroma.py +0 -0
  45. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/tests/test_data_source.py +0 -0
  46. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/tests/test_dataset.py +0 -0
  47. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/tests/test_elasticsearch_cloud.py +0 -0
  48. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/tests/test_models.py +0 -0
  49. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/tests/test_rate_runner.py +0 -0
  50. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/tests/test_redis.py +0 -0
  51. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/tests/test_utils.py +0 -0
  52. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/tests/ut_cases.py +0 -0
  53. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/__main__.py +0 -0
  54. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/__init__.py +0 -0
  55. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/assembler.py +0 -0
  56. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/cases.py +0 -0
  57. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/aliyun_elasticsearch/aliyun_elasticsearch.py +0 -0
  58. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/aliyun_elasticsearch/config.py +0 -0
  59. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/aliyun_opensearch/aliyun_opensearch.py +0 -0
  60. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/aliyun_opensearch/config.py +0 -0
  61. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/alloydb/alloydb.py +0 -0
  62. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/alloydb/cli.py +0 -0
  63. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/alloydb/config.py +0 -0
  64. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/aws_opensearch/aws_opensearch.py +0 -0
  65. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/aws_opensearch/cli.py +0 -0
  66. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/aws_opensearch/config.py +0 -0
  67. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/aws_opensearch/run.py +0 -0
  68. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/chroma/chroma.py +0 -0
  69. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/chroma/config.py +0 -0
  70. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/elastic_cloud/config.py +0 -0
  71. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/elastic_cloud/elastic_cloud.py +0 -0
  72. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/mariadb/cli.py +0 -0
  73. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/mariadb/config.py +0 -0
  74. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/mariadb/mariadb.py +0 -0
  75. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/memorydb/cli.py +0 -0
  76. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/memorydb/config.py +0 -0
  77. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/memorydb/memorydb.py +0 -0
  78. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/milvus/cli.py +0 -0
  79. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/milvus/config.py +0 -0
  80. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/milvus/milvus.py +0 -0
  81. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/mongodb/config.py +0 -0
  82. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/mongodb/mongodb.py +0 -0
  83. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/pgdiskann/cli.py +0 -0
  84. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/pgdiskann/config.py +0 -0
  85. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/pgdiskann/pgdiskann.py +0 -0
  86. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/pgvecto_rs/cli.py +0 -0
  87. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/pgvecto_rs/config.py +0 -0
  88. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/pgvecto_rs/pgvecto_rs.py +0 -0
  89. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/pgvector/cli.py +0 -0
  90. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/pgvector/config.py +0 -0
  91. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/pgvector/pgvector.py +0 -0
  92. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/pgvectorscale/cli.py +0 -0
  93. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/pgvectorscale/config.py +0 -0
  94. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/pgvectorscale/pgvectorscale.py +0 -0
  95. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/pinecone/config.py +0 -0
  96. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/pinecone/pinecone.py +0 -0
  97. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/qdrant_cloud/qdrant_cloud.py +0 -0
  98. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/redis/cli.py +0 -0
  99. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/redis/config.py +0 -0
  100. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/redis/redis.py +0 -0
  101. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/test/cli.py +0 -0
  102. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/test/config.py +0 -0
  103. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/test/test.py +0 -0
  104. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/tidb/cli.py +0 -0
  105. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/tidb/config.py +0 -0
  106. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/tidb/tidb.py +0 -0
  107. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/vespa/cli.py +0 -0
  108. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/vespa/config.py +0 -0
  109. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/vespa/util.py +0 -0
  110. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/vespa/vespa.py +0 -0
  111. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/weaviate_cloud/cli.py +0 -0
  112. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/weaviate_cloud/config.py +0 -0
  113. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/weaviate_cloud/weaviate_cloud.py +0 -0
  114. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/zilliz_cloud/cli.py +0 -0
  115. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/zilliz_cloud/config.py +0 -0
  116. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/clients/zilliz_cloud/zilliz_cloud.py +0 -0
  117. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/data_source.py +0 -0
  118. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/dataset.py +0 -0
  119. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/result_collector.py +0 -0
  120. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/runner/__init__.py +0 -0
  121. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/runner/rate_runner.py +0 -0
  122. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/runner/read_write_runner.py +0 -0
  123. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/runner/serial_runner.py +0 -0
  124. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/runner/util.py +0 -0
  125. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/backend/utils.py +0 -0
  126. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/base.py +0 -0
  127. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/cli/__init__.py +0 -0
  128. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/config-files/sample_config.yml +0 -0
  129. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/custom/custom_case.json +0 -0
  130. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/frontend/components/check_results/charts.py +0 -0
  131. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/frontend/components/check_results/data.py +0 -0
  132. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/frontend/components/check_results/expanderStyle.py +0 -0
  133. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/frontend/components/check_results/filters.py +0 -0
  134. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/frontend/components/check_results/footer.py +0 -0
  135. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/frontend/components/check_results/headerIcon.py +0 -0
  136. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/frontend/components/check_results/nav.py +0 -0
  137. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/frontend/components/check_results/priceTable.py +0 -0
  138. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/frontend/components/check_results/stPageConfig.py +0 -0
  139. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/frontend/components/concurrent/charts.py +0 -0
  140. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/frontend/components/custom/displayCustomCase.py +0 -0
  141. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/frontend/components/custom/displaypPrams.py +0 -0
  142. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/frontend/components/custom/getCustomConfig.py +0 -0
  143. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/frontend/components/custom/initStyle.py +0 -0
  144. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/frontend/components/get_results/saveAsImage.py +0 -0
  145. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/frontend/components/run_test/autoRefresh.py +0 -0
  146. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/frontend/components/run_test/caseSelector.py +0 -0
  147. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/frontend/components/run_test/dbSelector.py +0 -0
  148. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/frontend/components/run_test/generateTasks.py +0 -0
  149. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/frontend/components/run_test/hideSidebar.py +0 -0
  150. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/frontend/components/run_test/initStyle.py +0 -0
  151. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/frontend/components/run_test/submitTask.py +0 -0
  152. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/frontend/components/tables/data.py +0 -0
  153. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/frontend/config/dbPrices.py +0 -0
  154. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/frontend/pages/concurrent.py +0 -0
  155. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/frontend/pages/custom.py +0 -0
  156. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/frontend/pages/quries_per_dollar.py +0 -0
  157. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/frontend/pages/run_test.py +0 -0
  158. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/frontend/pages/tables.py +0 -0
  159. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/frontend/utils.py +0 -0
  160. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/frontend/vdb_benchmark.py +0 -0
  161. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/interface.py +0 -0
  162. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/log_util.py +0 -0
  163. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/metric.py +0 -0
  164. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/results/ElasticCloud/result_20230727_standard_elasticcloud.json +0 -0
  165. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/results/ElasticCloud/result_20230808_standard_elasticcloud.json +0 -0
  166. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/results/Milvus/result_20230727_standard_milvus.json +0 -0
  167. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/results/Milvus/result_20230808_standard_milvus.json +0 -0
  168. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/results/PgVector/result_20230727_standard_pgvector.json +0 -0
  169. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/results/PgVector/result_20230808_standard_pgvector.json +0 -0
  170. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/results/Pinecone/result_20230727_standard_pinecone.json +0 -0
  171. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/results/Pinecone/result_20230808_standard_pinecone.json +0 -0
  172. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/results/QdrantCloud/result_20230727_standard_qdrantcloud.json +0 -0
  173. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/results/QdrantCloud/result_20230808_standard_qdrantcloud.json +0 -0
  174. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/results/WeaviateCloud/result_20230727_standard_weaviatecloud.json +0 -0
  175. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/results/WeaviateCloud/result_20230808_standard_weaviatecloud.json +0 -0
  176. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/results/ZillizCloud/result_20230727_standard_zillizcloud.json +0 -0
  177. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/results/ZillizCloud/result_20230808_standard_zillizcloud.json +0 -0
  178. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/results/ZillizCloud/result_20240105_standard_202401_zillizcloud.json +0 -0
  179. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/results/dbPrices.json +0 -0
  180. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/results/getLeaderboardData.py +0 -0
  181. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench/results/leaderboard.json +0 -0
  182. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench.egg-info/dependency_links.txt +0 -0
  183. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench.egg-info/entry_points.txt +0 -0
  184. {vectordb_bench-0.0.27 → vectordb_bench-0.0.29}/vectordb_bench.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vectordb-bench
3
- Version: 0.0.27
3
+ Version: 0.0.29
4
4
  Summary: VectorDBBench is not just an offering of benchmark results for mainstream vector databases and cloud services, it's your go-to tool for the ultimate performance and cost-effectiveness comparison. Designed with ease-of-use in mind, VectorDBBench is devised to help users, even non-professionals, reproduce results or test new systems, making the hunt for the optimal choice amongst a plethora of cloud services and open-source vector databases a breeze.
5
5
  Author-email: XuanYang-cn <xuan.yang@zilliz.com>
6
6
  Project-URL: repository, https://github.com/zilliztech/VectorDBBench
@@ -52,6 +52,7 @@ Requires-Dist: mariadb; extra == "all"
52
52
  Requires-Dist: PyMySQL; extra == "all"
53
53
  Requires-Dist: clickhouse-connect; extra == "all"
54
54
  Requires-Dist: pyvespa; extra == "all"
55
+ Requires-Dist: lancedb; extra == "all"
55
56
  Provides-Extra: qdrant
56
57
  Requires-Dist: qdrant-client; extra == "qdrant"
57
58
  Provides-Extra: pinecone
@@ -87,15 +88,17 @@ Provides-Extra: clickhouse
87
88
  Requires-Dist: clickhouse-connect; extra == "clickhouse"
88
89
  Provides-Extra: vespa
89
90
  Requires-Dist: pyvespa; extra == "vespa"
91
+ Provides-Extra: lancedb
92
+ Requires-Dist: lancedb; extra == "lancedb"
90
93
  Dynamic: license-file
91
94
 
92
- # VectorDBBench: A Benchmark Tool for VectorDB
95
+ # VectorDBBench(VDBBench): A Benchmark Tool for VectorDB
93
96
 
94
97
  [![version](https://img.shields.io/pypi/v/vectordb-bench.svg?color=blue)](https://pypi.org/project/vectordb-bench/)
95
98
  [![Downloads](https://pepy.tech/badge/vectordb-bench)](https://pepy.tech/project/vectordb-bench)
96
99
 
97
100
  ## What is VectorDBBench
98
- VectorDBBench is not just an offering of benchmark results for mainstream vector databases and cloud services, it's your go-to tool for the ultimate performance and cost-effectiveness comparison. Designed with ease-of-use in mind, VectorDBBench is devised to help users, even non-professionals, reproduce results or test new systems, making the hunt for the optimal choice amongst a plethora of cloud services and open-source vector databases a breeze.
101
+ VectorDBBench(VDBBench) is not just an offering of benchmark results for mainstream vector databases and cloud services, it's your go-to tool for the ultimate performance and cost-effectiveness comparison. Designed with ease-of-use in mind, VectorDBBench is devised to help users, even non-professionals, reproduce results or test new systems, making the hunt for the optimal choice amongst a plethora of cloud services and open-source vector databases a breeze.
99
102
 
100
103
  Understanding the importance of user experience, we provide an intuitive visual interface. This not only empowers users to initiate benchmarks at ease, but also to view comparative result reports, thereby reproducing benchmark results effortlessly.
101
104
  To add more relevance and practicality, we provide cost-effectiveness reports particularly for cloud services. This allows for a more realistic and applicable benchmarking process.
@@ -205,6 +208,10 @@ Options:
205
208
  --num-concurrency TEXT Comma-separated list of concurrency values
206
209
  to test during concurrent search [default:
207
210
  1,10,20]
211
+ --concurrency-timeout INTEGER Timeout (in seconds) to wait for a
212
+ concurrency slot before failing. Set to a
213
+ negative value to wait indefinitely.
214
+ [default: 3600]
208
215
  --user-name TEXT Db username [required]
209
216
  --password TEXT Db password [required]
210
217
  --host TEXT Db host [required]
@@ -291,7 +298,8 @@ Options:
291
298
  # Memory Management
292
299
  --cb-threshold TEXT k-NN Memory circuit breaker threshold
293
300
 
294
- --help Show this message and exit.```
301
+ --help Show this message and exit.
302
+ ```
295
303
 
296
304
  #### Using a configuration file.
297
305
 
@@ -358,13 +366,13 @@ pip install -e '.[pinecone]'
358
366
  ```
359
367
  ### Run test server
360
368
  ```
361
- $ python -m vectordb_bench
369
+ python -m vectordb_bench
362
370
  ```
363
371
 
364
372
  OR:
365
373
 
366
374
  ```shell
367
- $ init_bench
375
+ init_bench
368
376
  ```
369
377
 
370
378
  OR:
@@ -381,13 +389,13 @@ After reopen the repository in container, run `python -m vectordb_bench` in the
381
389
 
382
390
  ### Check coding styles
383
391
  ```shell
384
- $ make lint
392
+ make lint
385
393
  ```
386
394
 
387
395
  To fix the coding styles automatically
388
396
 
389
397
  ```shell
390
- $ make format
398
+ make format
391
399
  ```
392
400
 
393
401
  ## How does it work?
@@ -1,10 +1,10 @@
1
- # VectorDBBench: A Benchmark Tool for VectorDB
1
+ # VectorDBBench(VDBBench): A Benchmark Tool for VectorDB
2
2
 
3
3
  [![version](https://img.shields.io/pypi/v/vectordb-bench.svg?color=blue)](https://pypi.org/project/vectordb-bench/)
4
4
  [![Downloads](https://pepy.tech/badge/vectordb-bench)](https://pepy.tech/project/vectordb-bench)
5
5
 
6
6
  ## What is VectorDBBench
7
- VectorDBBench is not just an offering of benchmark results for mainstream vector databases and cloud services, it's your go-to tool for the ultimate performance and cost-effectiveness comparison. Designed with ease-of-use in mind, VectorDBBench is devised to help users, even non-professionals, reproduce results or test new systems, making the hunt for the optimal choice amongst a plethora of cloud services and open-source vector databases a breeze.
7
+ VectorDBBench(VDBBench) is not just an offering of benchmark results for mainstream vector databases and cloud services, it's your go-to tool for the ultimate performance and cost-effectiveness comparison. Designed with ease-of-use in mind, VectorDBBench is devised to help users, even non-professionals, reproduce results or test new systems, making the hunt for the optimal choice amongst a plethora of cloud services and open-source vector databases a breeze.
8
8
 
9
9
  Understanding the importance of user experience, we provide an intuitive visual interface. This not only empowers users to initiate benchmarks at ease, but also to view comparative result reports, thereby reproducing benchmark results effortlessly.
10
10
  To add more relevance and practicality, we provide cost-effectiveness reports particularly for cloud services. This allows for a more realistic and applicable benchmarking process.
@@ -114,6 +114,10 @@ Options:
114
114
  --num-concurrency TEXT Comma-separated list of concurrency values
115
115
  to test during concurrent search [default:
116
116
  1,10,20]
117
+ --concurrency-timeout INTEGER Timeout (in seconds) to wait for a
118
+ concurrency slot before failing. Set to a
119
+ negative value to wait indefinitely.
120
+ [default: 3600]
117
121
  --user-name TEXT Db username [required]
118
122
  --password TEXT Db password [required]
119
123
  --host TEXT Db host [required]
@@ -200,7 +204,8 @@ Options:
200
204
  # Memory Management
201
205
  --cb-threshold TEXT k-NN Memory circuit breaker threshold
202
206
 
203
- --help Show this message and exit.```
207
+ --help Show this message and exit.
208
+ ```
204
209
 
205
210
  #### Using a configuration file.
206
211
 
@@ -267,13 +272,13 @@ pip install -e '.[pinecone]'
267
272
  ```
268
273
  ### Run test server
269
274
  ```
270
- $ python -m vectordb_bench
275
+ python -m vectordb_bench
271
276
  ```
272
277
 
273
278
  OR:
274
279
 
275
280
  ```shell
276
- $ init_bench
281
+ init_bench
277
282
  ```
278
283
 
279
284
  OR:
@@ -290,13 +295,13 @@ After reopen the repository in container, run `python -m vectordb_bench` in the
290
295
 
291
296
  ### Check coding styles
292
297
  ```shell
293
- $ make lint
298
+ make lint
294
299
  ```
295
300
 
296
301
  To fix the coding styles automatically
297
302
 
298
303
  ```shell
299
- $ make format
304
+ make format
300
305
  ```
301
306
 
302
307
  ## How does it work?
@@ -72,6 +72,7 @@ all = [
72
72
  "PyMySQL",
73
73
  "clickhouse-connect",
74
74
  "pyvespa",
75
+ "lancedb",
75
76
  ]
76
77
 
77
78
  qdrant = [ "qdrant-client" ]
@@ -94,6 +95,7 @@ mariadb = [ "mariadb" ]
94
95
  tidb = [ "PyMySQL" ]
95
96
  clickhouse = [ "clickhouse-connect" ]
96
97
  vespa = [ "pyvespa" ]
98
+ lancedb = [ "lancedb" ]
97
99
 
98
100
  [project.urls]
99
101
  "repository" = "https://github.com/zilliztech/VectorDBBench"
@@ -6,7 +6,7 @@ import environs
6
6
  from . import log_util
7
7
 
8
8
  env = environs.Env()
9
- env.read_env(".env", False)
9
+ env.read_env(path=".env", recurse=False)
10
10
 
11
11
 
12
12
  class config:
@@ -52,6 +52,8 @@ class config:
52
52
 
53
53
  CONCURRENCY_DURATION = 30
54
54
 
55
+ CONCURRENCY_TIMEOUT = 3600
56
+
55
57
  RESULTS_LOCAL_DIR = env.path(
56
58
  "RESULTS_LOCAL_DIR",
57
59
  pathlib.Path(__file__).parent.joinpath("results"),
@@ -45,9 +45,10 @@ class DB(Enum):
45
45
  TiDB = "TiDB"
46
46
  Clickhouse = "Clickhouse"
47
47
  Vespa = "Vespa"
48
+ LanceDB = "LanceDB"
48
49
 
49
50
  @property
50
- def init_cls(self) -> type[VectorDB]: # noqa: PLR0911, PLR0912, C901
51
+ def init_cls(self) -> type[VectorDB]: # noqa: PLR0911, PLR0912, C901, PLR0915
51
52
  """Import while in use"""
52
53
  if self == DB.Milvus:
53
54
  from .milvus.milvus import Milvus
@@ -164,11 +165,16 @@ class DB(Enum):
164
165
 
165
166
  return Vespa
166
167
 
168
+ if self == DB.LanceDB:
169
+ from .lancedb.lancedb import LanceDB
170
+
171
+ return LanceDB
172
+
167
173
  msg = f"Unknown DB: {self.name}"
168
174
  raise ValueError(msg)
169
175
 
170
176
  @property
171
- def config_cls(self) -> type[DBConfig]: # noqa: PLR0911, PLR0912, C901
177
+ def config_cls(self) -> type[DBConfig]: # noqa: PLR0911, PLR0912, C901, PLR0915
172
178
  """Import while in use"""
173
179
  if self == DB.Milvus:
174
180
  from .milvus.config import MilvusConfig
@@ -285,6 +291,11 @@ class DB(Enum):
285
291
 
286
292
  return VespaConfig
287
293
 
294
+ if self == DB.LanceDB:
295
+ from .lancedb.config import LanceDBConfig
296
+
297
+ return LanceDBConfig
298
+
288
299
  msg = f"Unknown DB: {self.name}"
289
300
  raise ValueError(msg)
290
301
 
@@ -382,6 +393,11 @@ class DB(Enum):
382
393
 
383
394
  return VespaHNSWConfig
384
395
 
396
+ if self == DB.LanceDB:
397
+ from .lancedb.config import _lancedb_case_config
398
+
399
+ return _lancedb_case_config.get(index_type)
400
+
385
401
  # DB.Pinecone, DB.Chroma, DB.Redis
386
402
  return EmptyDBCaseConfig
387
403
 
@@ -34,6 +34,7 @@ class IndexType(str, Enum):
34
34
  GPU_IVF_PQ = "GPU_IVF_PQ"
35
35
  GPU_CAGRA = "GPU_CAGRA"
36
36
  SCANN = "scann"
37
+ NONE = "NONE"
37
38
 
38
39
 
39
40
  class SQType(str, Enum):
@@ -51,6 +51,7 @@ def Clickhouse(**parameters: Unpack[ClickhouseHNSWTypedDict]):
51
51
  db=DB.Clickhouse,
52
52
  db_config=ClickhouseConfig(
53
53
  db_label=parameters["db_label"],
54
+ user=parameters["user"],
54
55
  password=SecretStr(parameters["password"]) if parameters["password"] else None,
55
56
  host=parameters["host"],
56
57
  port=parameters["port"],
@@ -106,7 +106,7 @@ class Clickhouse(VectorDB):
106
106
  query = f"""
107
107
  ALTER TABLE {self.db_config["database"]}.{self.table_name}
108
108
  ADD INDEX {self._index_name} {self._vector_field}
109
- TYPE vector_similarity('hnsw', '{self.index_param["metric_type"]}',
109
+ TYPE vector_similarity('hnsw', '{self.index_param["metric_type"]}',{self.dim},
110
110
  '{self.index_param["quantization"]}',
111
111
  {self.index_param["params"]["M"]}, {self.index_param["params"]["efConstruction"]})
112
112
  GRANULARITY {self.index_param["granularity"]}
@@ -115,7 +115,7 @@ class Clickhouse(VectorDB):
115
115
  query = f"""
116
116
  ALTER TABLE {self.db_config["database"]}.{self.table_name}
117
117
  ADD INDEX {self._index_name} {self._vector_field}
118
- TYPE vector_similarity('hnsw', '{self.index_param["metric_type"]}')
118
+ TYPE vector_similarity('hnsw', '{self.index_param["metric_type"]}', {self.dim})
119
119
  GRANULARITY {self.index_param["granularity"]}
120
120
  """
121
121
  self.conn.command(cmd=query)
@@ -186,7 +186,7 @@ class Clickhouse(VectorDB):
186
186
  "vector_field": self._vector_field,
187
187
  "schema": self.db_config["database"],
188
188
  "table": self.table_name,
189
- "gt": filters.get("id"),
189
+ "gt": 0 if filters is None else filters.get("id", 0),
190
190
  "k": k,
191
191
  "metric_type": self.search_param["metric_type"],
192
192
  "query": query,
@@ -16,7 +16,7 @@ class ClickhouseConfigDict(TypedDict):
16
16
 
17
17
 
18
18
  class ClickhouseConfig(DBConfig):
19
- user_name: str = "clickhouse"
19
+ user: str = "clickhouse"
20
20
  password: SecretStr
21
21
  host: str = "localhost"
22
22
  port: int = 8123
@@ -29,7 +29,7 @@ class ClickhouseConfig(DBConfig):
29
29
  "host": self.host,
30
30
  "port": self.port,
31
31
  "database": self.db_name,
32
- "user": self.user_name,
32
+ "user": self.user,
33
33
  "password": pwd_str,
34
34
  "secure": self.secure,
35
35
  }
@@ -0,0 +1,92 @@
1
+ from typing import Annotated, Unpack
2
+
3
+ import click
4
+ from pydantic import SecretStr
5
+
6
+ from ....cli.cli import (
7
+ CommonTypedDict,
8
+ cli,
9
+ click_parameter_decorators_from_typed_dict,
10
+ run,
11
+ )
12
+ from .. import DB
13
+ from ..api import IndexType
14
+
15
+
16
+ class LanceDBTypedDict(CommonTypedDict):
17
+ uri: Annotated[
18
+ str,
19
+ click.option("--uri", type=str, help="URI connection string", required=True),
20
+ ]
21
+ token: Annotated[
22
+ str | None,
23
+ click.option("--token", type=str, help="Authentication token", required=False),
24
+ ]
25
+
26
+
27
+ @cli.command()
28
+ @click_parameter_decorators_from_typed_dict(LanceDBTypedDict)
29
+ def LanceDB(**parameters: Unpack[LanceDBTypedDict]):
30
+ from .config import LanceDBConfig, _lancedb_case_config
31
+
32
+ run(
33
+ db=DB.LanceDB,
34
+ db_config=LanceDBConfig(
35
+ db_label=parameters["db_label"],
36
+ uri=parameters["uri"],
37
+ token=SecretStr(parameters["token"]) if parameters.get("token") else None,
38
+ ),
39
+ db_case_config=_lancedb_case_config.get("NONE")(),
40
+ **parameters,
41
+ )
42
+
43
+
44
+ @cli.command()
45
+ @click_parameter_decorators_from_typed_dict(LanceDBTypedDict)
46
+ def LanceDBAutoIndex(**parameters: Unpack[LanceDBTypedDict]):
47
+ from .config import LanceDBConfig, _lancedb_case_config
48
+
49
+ run(
50
+ db=DB.LanceDB,
51
+ db_config=LanceDBConfig(
52
+ db_label=parameters["db_label"],
53
+ uri=parameters["uri"],
54
+ token=SecretStr(parameters["token"]) if parameters.get("token") else None,
55
+ ),
56
+ db_case_config=_lancedb_case_config.get(IndexType.AUTOINDEX)(),
57
+ **parameters,
58
+ )
59
+
60
+
61
+ @cli.command()
62
+ @click_parameter_decorators_from_typed_dict(LanceDBTypedDict)
63
+ def LanceDBIVFPQ(**parameters: Unpack[LanceDBTypedDict]):
64
+ from .config import LanceDBConfig, _lancedb_case_config
65
+
66
+ run(
67
+ db=DB.LanceDB,
68
+ db_config=LanceDBConfig(
69
+ db_label=parameters["db_label"],
70
+ uri=parameters["uri"],
71
+ token=SecretStr(parameters["token"]) if parameters.get("token") else None,
72
+ ),
73
+ db_case_config=_lancedb_case_config.get(IndexType.IVFPQ)(),
74
+ **parameters,
75
+ )
76
+
77
+
78
+ @cli.command()
79
+ @click_parameter_decorators_from_typed_dict(LanceDBTypedDict)
80
+ def LanceDBHNSW(**parameters: Unpack[LanceDBTypedDict]):
81
+ from .config import LanceDBConfig, _lancedb_case_config
82
+
83
+ run(
84
+ db=DB.LanceDB,
85
+ db_config=LanceDBConfig(
86
+ db_label=parameters["db_label"],
87
+ uri=parameters["uri"],
88
+ token=SecretStr(parameters["token"]) if parameters.get("token") else None,
89
+ ),
90
+ db_case_config=_lancedb_case_config.get(IndexType.HNSW)(),
91
+ **parameters,
92
+ )
@@ -0,0 +1,103 @@
1
+ from pydantic import BaseModel, SecretStr
2
+
3
+ from ..api import DBCaseConfig, DBConfig, IndexType, MetricType
4
+
5
+
6
+ class LanceDBConfig(DBConfig):
7
+ """LanceDB connection configuration."""
8
+
9
+ db_label: str
10
+ uri: str
11
+ token: SecretStr | None = None
12
+
13
+ def to_dict(self) -> dict:
14
+ return {
15
+ "uri": self.uri,
16
+ "token": self.token.get_secret_value() if self.token else None,
17
+ }
18
+
19
+
20
+ class LanceDBIndexConfig(BaseModel, DBCaseConfig):
21
+ index: IndexType = IndexType.IVFPQ
22
+ metric_type: MetricType = MetricType.L2
23
+ num_partitions: int = 0
24
+ num_sub_vectors: int = 0
25
+ nbits: int = 8 # Must be 4 or 8
26
+ sample_rate: int = 256
27
+ max_iterations: int = 50
28
+
29
+ def index_param(self) -> dict:
30
+ if self.index not in [
31
+ IndexType.IVFPQ,
32
+ IndexType.HNSW,
33
+ IndexType.AUTOINDEX,
34
+ IndexType.NONE,
35
+ ]:
36
+ msg = f"Index type {self.index} is not supported for LanceDB!"
37
+ raise ValueError(msg)
38
+
39
+ # See https://lancedb.github.io/lancedb/python/python/#lancedb.table.Table.create_index
40
+ params = {
41
+ "metric": self.parse_metric(),
42
+ "num_bits": self.nbits,
43
+ "sample_rate": self.sample_rate,
44
+ "max_iterations": self.max_iterations,
45
+ }
46
+
47
+ if self.num_partitions > 0:
48
+ params["num_partitions"] = self.num_partitions
49
+ if self.num_sub_vectors > 0:
50
+ params["num_sub_vectors"] = self.num_sub_vectors
51
+
52
+ return params
53
+
54
+ def search_param(self) -> dict:
55
+ pass
56
+
57
+ def parse_metric(self) -> str:
58
+ if self.metric_type in [MetricType.L2, MetricType.COSINE]:
59
+ return self.metric_type.value.lower()
60
+ if self.metric_type in [MetricType.IP, MetricType.DP]:
61
+ return "dot"
62
+ msg = f"Metric type {self.metric_type} is not supported for LanceDB!"
63
+ raise ValueError(msg)
64
+
65
+
66
+ class LanceDBNoIndexConfig(LanceDBIndexConfig):
67
+ index: IndexType = IndexType.NONE
68
+
69
+ def index_param(self) -> dict:
70
+ return {}
71
+
72
+
73
+ class LanceDBAutoIndexConfig(LanceDBIndexConfig):
74
+ index: IndexType = IndexType.AUTOINDEX
75
+
76
+ def index_param(self) -> dict:
77
+ return {}
78
+
79
+
80
+ class LanceDBHNSWIndexConfig(LanceDBIndexConfig):
81
+ index: IndexType = IndexType.HNSW
82
+ m: int = 0
83
+ ef_construction: int = 0
84
+
85
+ def index_param(self) -> dict:
86
+ params = LanceDBIndexConfig.index_param(self)
87
+
88
+ # See https://lancedb.github.io/lancedb/python/python/#lancedb.index.HnswSq
89
+ params["index_type"] = "IVF_HNSW_SQ"
90
+ if self.m > 0:
91
+ params["m"] = self.m
92
+ if self.ef_construction > 0:
93
+ params["ef_construction"] = self.ef_construction
94
+
95
+ return params
96
+
97
+
98
+ _lancedb_case_config = {
99
+ IndexType.IVFPQ: LanceDBIndexConfig,
100
+ IndexType.AUTOINDEX: LanceDBAutoIndexConfig,
101
+ IndexType.HNSW: LanceDBHNSWIndexConfig,
102
+ IndexType.NONE: LanceDBNoIndexConfig,
103
+ }
@@ -0,0 +1,97 @@
1
+ import logging
2
+ from contextlib import contextmanager
3
+
4
+ import lancedb
5
+ import pyarrow as pa
6
+ from lancedb.pydantic import LanceModel
7
+
8
+ from ..api import IndexType, VectorDB
9
+ from .config import LanceDBConfig, LanceDBIndexConfig
10
+
11
+ log = logging.getLogger(__name__)
12
+
13
+
14
+ class VectorModel(LanceModel):
15
+ id: int
16
+ vector: list[float]
17
+
18
+
19
+ class LanceDB(VectorDB):
20
+ def __init__(
21
+ self,
22
+ dim: int,
23
+ db_config: LanceDBConfig,
24
+ db_case_config: LanceDBIndexConfig,
25
+ collection_name: str = "vector_bench_test",
26
+ drop_old: bool = False,
27
+ **kwargs,
28
+ ):
29
+ self.name = "LanceDB"
30
+ self.db_config = db_config
31
+ self.case_config = db_case_config
32
+ self.table_name = collection_name
33
+ self.dim = dim
34
+ self.uri = db_config["uri"]
35
+
36
+ db = lancedb.connect(self.uri)
37
+
38
+ if drop_old:
39
+ try:
40
+ db.drop_table(self.table_name)
41
+ except Exception as e:
42
+ log.warning(f"Failed to drop table {self.table_name}: {e}")
43
+
44
+ try:
45
+ db.open_table(self.table_name)
46
+ except Exception:
47
+ schema = pa.schema(
48
+ [pa.field("id", pa.int64()), pa.field("vector", pa.list_(pa.float64(), list_size=self.dim))]
49
+ )
50
+ db.create_table(self.table_name, schema=schema, mode="overwrite")
51
+
52
+ @contextmanager
53
+ def init(self):
54
+ self.db = lancedb.connect(self.uri)
55
+ self.table = self.db.open_table(self.table_name)
56
+ yield
57
+ self.db = None
58
+ self.table = None
59
+
60
+ def insert_embeddings(
61
+ self,
62
+ embeddings: list[list[float]],
63
+ metadata: list[int],
64
+ ) -> tuple[int, Exception | None]:
65
+ try:
66
+ data = [{"id": meta, "vector": emb} for meta, emb in zip(metadata, embeddings, strict=False)]
67
+ self.table.add(data)
68
+ return len(metadata), None
69
+ except Exception as e:
70
+ log.warning(f"Failed to insert data into LanceDB table ({self.table_name}), error: {e}")
71
+ return 0, e
72
+
73
+ def search_embedding(
74
+ self,
75
+ query: list[float],
76
+ k: int = 100,
77
+ filters: dict | None = None,
78
+ ) -> list[int]:
79
+ if filters:
80
+ results = (
81
+ self.table.search(query)
82
+ .select(["id"])
83
+ .where(f"id >= {filters['id']}", prefilter=True)
84
+ .limit(k)
85
+ .to_list()
86
+ )
87
+ else:
88
+ results = self.table.search(query).select(["id"]).limit(k).to_list()
89
+ return [int(result["id"]) for result in results]
90
+
91
+ def optimize(self, data_size: int | None = None):
92
+ if self.table and hasattr(self, "case_config") and self.case_config.index != IndexType.NONE:
93
+ log.info(f"Creating index for LanceDB table ({self.table_name})")
94
+ self.table.create_index(**self.case_config.index_param())
95
+ # Better recall with IVF_PQ (though still bad) but breaks HNSW: https://github.com/lancedb/lancedb/issues/2369
96
+ if self.case_config.index in (IndexType.IVFPQ, IndexType.AUTOINDEX):
97
+ self.table.optimize()
@@ -0,0 +1,43 @@
1
+ from typing import Annotated, Unpack
2
+
3
+ import click
4
+ from pydantic import SecretStr
5
+
6
+ from ....cli.cli import (
7
+ CommonTypedDict,
8
+ cli,
9
+ click_parameter_decorators_from_typed_dict,
10
+ run,
11
+ )
12
+ from .. import DB
13
+
14
+
15
+ class QdrantTypedDict(CommonTypedDict):
16
+ url: Annotated[
17
+ str,
18
+ click.option("--url", type=str, help="URL connection string", required=True),
19
+ ]
20
+ api_key: Annotated[
21
+ str | None,
22
+ click.option("--api-key", type=str, help="API key for authentication", required=False),
23
+ ]
24
+
25
+
26
+ @cli.command()
27
+ @click_parameter_decorators_from_typed_dict(QdrantTypedDict)
28
+ def QdrantCloud(**parameters: Unpack[QdrantTypedDict]):
29
+ from .config import QdrantConfig, QdrantIndexConfig
30
+
31
+ config_params = {
32
+ "db_label": parameters["db_label"],
33
+ "url": SecretStr(parameters["url"]),
34
+ }
35
+
36
+ config_params["api_key"] = SecretStr(parameters["api_key"]) if parameters["api_key"] else None
37
+
38
+ run(
39
+ db=DB.QdrantCloud,
40
+ db_config=QdrantConfig(**config_params),
41
+ db_case_config=QdrantIndexConfig(),
42
+ **parameters,
43
+ )
@@ -6,14 +6,14 @@ from ..api import DBCaseConfig, DBConfig, MetricType
6
6
  # Allowing `api_key` to be left empty, to ensure compatibility with the open-source Qdrant.
7
7
  class QdrantConfig(DBConfig):
8
8
  url: SecretStr
9
- api_key: SecretStr
9
+ api_key: SecretStr | None = None
10
10
 
11
11
  def to_dict(self) -> dict:
12
- api_key = self.api_key.get_secret_value()
13
- if len(api_key) > 0:
12
+ api_key_value = self.api_key.get_secret_value() if self.api_key else None
13
+ if api_key_value:
14
14
  return {
15
15
  "url": self.url.get_secret_value(),
16
- "api_key": self.api_key.get_secret_value(),
16
+ "api_key": api_key_value,
17
17
  "prefer_grpc": True,
18
18
  }
19
19
  return {