vectordb-bench 0.0.12__tar.gz → 0.0.14__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 (157) hide show
  1. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/.gitignore +1 -0
  2. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/PKG-INFO +36 -3
  3. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/README.md +27 -0
  4. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/install/requirements_py3.11.txt +1 -0
  5. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/pyproject.toml +4 -2
  6. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/__init__.py +22 -0
  7. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/api.py +21 -1
  8. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/aws_opensearch/aws_opensearch.py +47 -6
  9. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/aws_opensearch/config.py +12 -6
  10. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/aws_opensearch/run.py +34 -3
  11. vectordb_bench-0.0.14/vectordb_bench/backend/clients/memorydb/cli.py +88 -0
  12. vectordb_bench-0.0.14/vectordb_bench/backend/clients/memorydb/config.py +54 -0
  13. vectordb_bench-0.0.14/vectordb_bench/backend/clients/memorydb/memorydb.py +254 -0
  14. vectordb_bench-0.0.14/vectordb_bench/backend/clients/pgvecto_rs/cli.py +154 -0
  15. vectordb_bench-0.0.14/vectordb_bench/backend/clients/pgvecto_rs/config.py +162 -0
  16. vectordb_bench-0.0.14/vectordb_bench/backend/clients/pgvecto_rs/pgvecto_rs.py +292 -0
  17. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/pgvector/cli.py +17 -2
  18. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/pgvector/config.py +20 -5
  19. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/pgvector/pgvector.py +95 -25
  20. vectordb_bench-0.0.14/vectordb_bench/backend/clients/pgvectorscale/cli.py +108 -0
  21. vectordb_bench-0.0.14/vectordb_bench/backend/clients/pgvectorscale/config.py +111 -0
  22. vectordb_bench-0.0.14/vectordb_bench/backend/clients/pgvectorscale/pgvectorscale.py +290 -0
  23. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/pinecone/config.py +0 -2
  24. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/pinecone/pinecone.py +34 -36
  25. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/redis/cli.py +8 -0
  26. vectordb_bench-0.0.14/vectordb_bench/backend/clients/redis/config.py +45 -0
  27. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/backend/runner/mp_runner.py +2 -1
  28. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/cli/cli.py +137 -0
  29. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/cli/vectordbbench.py +7 -1
  30. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/check_results/charts.py +9 -6
  31. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/check_results/data.py +13 -6
  32. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/concurrent/charts.py +3 -6
  33. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/run_test/caseSelector.py +10 -0
  34. vectordb_bench-0.0.14/vectordb_bench/frontend/components/run_test/dbConfigSetting.py +77 -0
  35. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/run_test/initStyle.py +3 -1
  36. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/frontend/config/dbCaseConfigs.py +230 -9
  37. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/frontend/pages/quries_per_dollar.py +13 -5
  38. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/frontend/vdb_benchmark.py +11 -3
  39. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/models.py +25 -9
  40. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/results/Milvus/result_20230727_standard_milvus.json +53 -1
  41. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/results/Milvus/result_20230808_standard_milvus.json +48 -0
  42. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/results/ZillizCloud/result_20230727_standard_zillizcloud.json +29 -1
  43. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/results/ZillizCloud/result_20230808_standard_zillizcloud.json +24 -0
  44. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/results/ZillizCloud/result_20240105_standard_202401_zillizcloud.json +98 -49
  45. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/results/getLeaderboardData.py +17 -7
  46. vectordb_bench-0.0.14/vectordb_bench/results/leaderboard.json +1 -0
  47. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench.egg-info/PKG-INFO +36 -3
  48. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench.egg-info/SOURCES.txt +7 -0
  49. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench.egg-info/requires.txt +10 -2
  50. vectordb_bench-0.0.12/vectordb_bench/backend/clients/pgvecto_rs/config.py +0 -127
  51. vectordb_bench-0.0.12/vectordb_bench/backend/clients/pgvecto_rs/pgvecto_rs.py +0 -192
  52. vectordb_bench-0.0.12/vectordb_bench/backend/clients/redis/config.py +0 -14
  53. vectordb_bench-0.0.12/vectordb_bench/frontend/components/run_test/dbConfigSetting.py +0 -55
  54. vectordb_bench-0.0.12/vectordb_bench/results/leaderboard.json +0 -1
  55. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/.devcontainer/Dockerfile +0 -0
  56. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/.devcontainer/devcontainer.json +0 -0
  57. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/.env.example +0 -0
  58. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/.github/workflows/publish_package_on_release.yml +0 -0
  59. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/.github/workflows/pull_request.yml +0 -0
  60. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/.ruff.toml +0 -0
  61. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/Dockerfile +0 -0
  62. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/LICENSE +0 -0
  63. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/Makefile +0 -0
  64. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/OWNERS +0 -0
  65. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/fig/custom_case_run_test.png +0 -0
  66. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/fig/custom_dataset.png +0 -0
  67. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/install.py +0 -0
  68. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/setup.cfg +0 -0
  69. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/tests/conftest.py +0 -0
  70. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/tests/pytest.ini +0 -0
  71. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/tests/test_bench_runner.py +0 -0
  72. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/tests/test_chroma.py +0 -0
  73. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/tests/test_data_source.py +0 -0
  74. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/tests/test_dataset.py +0 -0
  75. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/tests/test_elasticsearch_cloud.py +0 -0
  76. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/tests/test_models.py +0 -0
  77. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/tests/test_redis.py +0 -0
  78. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/tests/test_utils.py +0 -0
  79. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/tests/ut_cases.py +0 -0
  80. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/__init__.py +0 -0
  81. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/__main__.py +0 -0
  82. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/backend/__init__.py +0 -0
  83. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/backend/assembler.py +0 -0
  84. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/backend/cases.py +0 -0
  85. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/aws_opensearch/cli.py +0 -0
  86. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/chroma/chroma.py +0 -0
  87. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/chroma/config.py +0 -0
  88. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/elastic_cloud/config.py +0 -0
  89. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/elastic_cloud/elastic_cloud.py +0 -0
  90. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/milvus/cli.py +0 -0
  91. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/milvus/config.py +0 -0
  92. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/milvus/milvus.py +0 -0
  93. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/qdrant_cloud/config.py +0 -0
  94. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/qdrant_cloud/qdrant_cloud.py +0 -0
  95. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/redis/redis.py +0 -0
  96. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/test/cli.py +0 -0
  97. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/test/config.py +0 -0
  98. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/test/test.py +0 -0
  99. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/weaviate_cloud/cli.py +0 -0
  100. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/weaviate_cloud/config.py +0 -0
  101. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/weaviate_cloud/weaviate_cloud.py +0 -0
  102. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/zilliz_cloud/cli.py +0 -0
  103. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/zilliz_cloud/config.py +0 -0
  104. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/zilliz_cloud/zilliz_cloud.py +0 -0
  105. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/backend/data_source.py +0 -0
  106. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/backend/dataset.py +0 -0
  107. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/backend/result_collector.py +0 -0
  108. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/backend/runner/__init__.py +0 -0
  109. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/backend/runner/serial_runner.py +0 -0
  110. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/backend/task_runner.py +0 -0
  111. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/backend/utils.py +0 -0
  112. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/base.py +0 -0
  113. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/cli/__init__.py +0 -0
  114. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/config-files/sample_config.yml +0 -0
  115. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/custom/custom_case.json +0 -0
  116. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/check_results/expanderStyle.py +0 -0
  117. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/check_results/filters.py +0 -0
  118. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/check_results/footer.py +0 -0
  119. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/check_results/headerIcon.py +0 -0
  120. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/check_results/nav.py +0 -0
  121. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/check_results/priceTable.py +0 -0
  122. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/check_results/stPageConfig.py +0 -0
  123. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/custom/displayCustomCase.py +0 -0
  124. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/custom/displaypPrams.py +0 -0
  125. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/custom/getCustomConfig.py +0 -0
  126. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/custom/initStyle.py +0 -0
  127. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/get_results/saveAsImage.py +0 -0
  128. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/run_test/autoRefresh.py +0 -0
  129. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/run_test/dbSelector.py +0 -0
  130. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/run_test/generateTasks.py +0 -0
  131. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/run_test/hideSidebar.py +0 -0
  132. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/run_test/submitTask.py +0 -0
  133. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/tables/data.py +0 -0
  134. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/frontend/config/dbPrices.py +0 -0
  135. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/frontend/config/styles.py +0 -0
  136. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/frontend/pages/concurrent.py +0 -0
  137. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/frontend/pages/custom.py +0 -0
  138. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/frontend/pages/run_test.py +0 -0
  139. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/frontend/pages/tables.py +0 -0
  140. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/frontend/utils.py +0 -0
  141. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/interface.py +0 -0
  142. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/log_util.py +0 -0
  143. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/metric.py +0 -0
  144. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/results/ElasticCloud/result_20230727_standard_elasticcloud.json +0 -0
  145. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/results/ElasticCloud/result_20230808_standard_elasticcloud.json +0 -0
  146. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/results/PgVector/result_20230727_standard_pgvector.json +0 -0
  147. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/results/PgVector/result_20230808_standard_pgvector.json +0 -0
  148. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/results/Pinecone/result_20230727_standard_pinecone.json +0 -0
  149. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/results/Pinecone/result_20230808_standard_pinecone.json +0 -0
  150. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/results/QdrantCloud/result_20230727_standard_qdrantcloud.json +0 -0
  151. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/results/QdrantCloud/result_20230808_standard_qdrantcloud.json +0 -0
  152. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/results/WeaviateCloud/result_20230727_standard_weaviatecloud.json +0 -0
  153. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/results/WeaviateCloud/result_20230808_standard_weaviatecloud.json +0 -0
  154. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench/results/dbPrices.json +0 -0
  155. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench.egg-info/dependency_links.txt +0 -0
  156. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench.egg-info/entry_points.txt +0 -0
  157. {vectordb_bench-0.0.12 → vectordb_bench-0.0.14}/vectordb_bench.egg-info/top_level.txt +0 -0
@@ -9,3 +9,4 @@ __MACOSX
9
9
  build/
10
10
  venv/
11
11
  .idea/
12
+ results/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: vectordb-bench
3
- Version: 0.0.12
3
+ Version: 0.0.14
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
@@ -36,10 +36,10 @@ Requires-Dist: pinecone-client; extra == "all"
36
36
  Requires-Dist: weaviate-client; extra == "all"
37
37
  Requires-Dist: elasticsearch; extra == "all"
38
38
  Requires-Dist: pgvector; extra == "all"
39
+ Requires-Dist: pgvecto_rs[psycopg3]>=0.2.2; extra == "all"
39
40
  Requires-Dist: sqlalchemy; extra == "all"
40
41
  Requires-Dist: redis; extra == "all"
41
42
  Requires-Dist: chromadb; extra == "all"
42
- Requires-Dist: psycopg2; extra == "all"
43
43
  Requires-Dist: psycopg; extra == "all"
44
44
  Requires-Dist: psycopg-binary; extra == "all"
45
45
  Requires-Dist: opensearch-dsl==2.1.0; extra == "all"
@@ -56,10 +56,16 @@ Provides-Extra: pgvector
56
56
  Requires-Dist: psycopg; extra == "pgvector"
57
57
  Requires-Dist: psycopg-binary; extra == "pgvector"
58
58
  Requires-Dist: pgvector; extra == "pgvector"
59
+ Provides-Extra: pgvectorscale
60
+ Requires-Dist: psycopg; extra == "pgvectorscale"
61
+ Requires-Dist: psycopg-binary; extra == "pgvectorscale"
62
+ Requires-Dist: pgvector; extra == "pgvectorscale"
59
63
  Provides-Extra: pgvecto-rs
60
- Requires-Dist: psycopg2; extra == "pgvecto-rs"
64
+ Requires-Dist: pgvecto_rs[psycopg3]>=0.2.2; extra == "pgvecto-rs"
61
65
  Provides-Extra: redis
62
66
  Requires-Dist: redis; extra == "redis"
67
+ Provides-Extra: memorydb
68
+ Requires-Dist: memorydb; extra == "memorydb"
63
69
  Provides-Extra: chromadb
64
70
  Requires-Dist: chromadb; extra == "chromadb"
65
71
  Provides-Extra: awsopensearch
@@ -105,7 +111,9 @@ All the database client supported
105
111
  | elastic | `pip install vectordb-bench[elastic]` |
106
112
  | pgvector | `pip install vectordb-bench[pgvector]` |
107
113
  | pgvecto.rs | `pip install vectordb-bench[pgvecto_rs]` |
114
+ | pgvectorscale | `pip install vectordb-bench[pgvectorscale]` |
108
115
  | redis | `pip install vectordb-bench[redis]` |
116
+ | memorydb | `pip install vectordb-bench[memorydb]` |
109
117
  | chromadb | `pip install vectordb-bench[chromadb]` |
110
118
  | awsopensearch | `pip install vectordb-bench[awsopensearch]` |
111
119
 
@@ -183,6 +191,29 @@ Options:
183
191
  --m INTEGER hnsw m
184
192
  --ef-construction INTEGER hnsw ef-construction
185
193
  --ef-search INTEGER hnsw ef-search
194
+ --quantization-type [none|halfvec]
195
+ quantization type for vectors
196
+ --custom-case-name TEXT Custom case name i.e. PerformanceCase1536D50K
197
+ --custom-case-description TEXT Custom name description
198
+ --custom-case-load-timeout INTEGER
199
+ Custom case load timeout [default: 36000]
200
+ --custom-case-optimize-timeout INTEGER
201
+ Custom case optimize timeout [default: 36000]
202
+ --custom-dataset-name TEXT
203
+ Dataset name i.e OpenAI
204
+ --custom-dataset-dir TEXT Dataset directory i.e. openai_medium_500k
205
+ --custom-dataset-size INTEGER Dataset size i.e. 500000
206
+ --custom-dataset-dim INTEGER Dataset dimension
207
+ --custom-dataset-metric-type TEXT
208
+ Dataset distance metric [default: COSINE]
209
+ --custom-dataset-file-count INTEGER
210
+ Dataset file count
211
+ --custom-dataset-use-shuffled / --skip-custom-dataset-use-shuffled
212
+ Use shuffled custom dataset or skip [default: custom-dataset-
213
+ use-shuffled]
214
+ --custom-dataset-with-gt / --skip-custom-dataset-with-gt
215
+ Custom dataset with ground truth or skip [default: custom-dataset-
216
+ with-gt]
186
217
  --help Show this message and exit.
187
218
  ```
188
219
  #### Using a configuration file.
@@ -527,6 +558,8 @@ def ZillizAutoIndex(**parameters: Unpack[ZillizTypedDict]):
527
558
  3. Update db_config and db_case_config to match client requirements
528
559
  4. Continue to add new functions for each index config.
529
560
  5. Import the client cli module and command to vectordb_bench/cli/vectordbbench.py (for databases with multiple commands (index configs), this only needs to be done for one command)
561
+ 6. Import the `get_custom_case_config` function from `vectordb_bench/cli/cli.py` and use it to add a new key `custom_case` to the `parameters` variable within the command.
562
+
530
563
 
531
564
  > cli modules with multiple index configs:
532
565
  > - pgvector: vectordb_bench/backend/clients/pgvector/cli.py
@@ -37,7 +37,9 @@ All the database client supported
37
37
  | elastic | `pip install vectordb-bench[elastic]` |
38
38
  | pgvector | `pip install vectordb-bench[pgvector]` |
39
39
  | pgvecto.rs | `pip install vectordb-bench[pgvecto_rs]` |
40
+ | pgvectorscale | `pip install vectordb-bench[pgvectorscale]` |
40
41
  | redis | `pip install vectordb-bench[redis]` |
42
+ | memorydb | `pip install vectordb-bench[memorydb]` |
41
43
  | chromadb | `pip install vectordb-bench[chromadb]` |
42
44
  | awsopensearch | `pip install vectordb-bench[awsopensearch]` |
43
45
 
@@ -115,6 +117,29 @@ Options:
115
117
  --m INTEGER hnsw m
116
118
  --ef-construction INTEGER hnsw ef-construction
117
119
  --ef-search INTEGER hnsw ef-search
120
+ --quantization-type [none|halfvec]
121
+ quantization type for vectors
122
+ --custom-case-name TEXT Custom case name i.e. PerformanceCase1536D50K
123
+ --custom-case-description TEXT Custom name description
124
+ --custom-case-load-timeout INTEGER
125
+ Custom case load timeout [default: 36000]
126
+ --custom-case-optimize-timeout INTEGER
127
+ Custom case optimize timeout [default: 36000]
128
+ --custom-dataset-name TEXT
129
+ Dataset name i.e OpenAI
130
+ --custom-dataset-dir TEXT Dataset directory i.e. openai_medium_500k
131
+ --custom-dataset-size INTEGER Dataset size i.e. 500000
132
+ --custom-dataset-dim INTEGER Dataset dimension
133
+ --custom-dataset-metric-type TEXT
134
+ Dataset distance metric [default: COSINE]
135
+ --custom-dataset-file-count INTEGER
136
+ Dataset file count
137
+ --custom-dataset-use-shuffled / --skip-custom-dataset-use-shuffled
138
+ Use shuffled custom dataset or skip [default: custom-dataset-
139
+ use-shuffled]
140
+ --custom-dataset-with-gt / --skip-custom-dataset-with-gt
141
+ Custom dataset with ground truth or skip [default: custom-dataset-
142
+ with-gt]
118
143
  --help Show this message and exit.
119
144
  ```
120
145
  #### Using a configuration file.
@@ -459,6 +484,8 @@ def ZillizAutoIndex(**parameters: Unpack[ZillizTypedDict]):
459
484
  3. Update db_config and db_case_config to match client requirements
460
485
  4. Continue to add new functions for each index config.
461
486
  5. Import the client cli module and command to vectordb_bench/cli/vectordbbench.py (for databases with multiple commands (index configs), this only needs to be done for one command)
487
+ 6. Import the `get_custom_case_config` function from `vectordb_bench/cli/cli.py` and use it to add a new key `custom_case` to the `parameters` variable within the command.
488
+
462
489
 
463
490
  > cli modules with multiple index configs:
464
491
  > - pgvector: vectordb_bench/backend/clients/pgvector/cli.py
@@ -5,6 +5,7 @@ pinecone-client
5
5
  weaviate-client
6
6
  elasticsearch
7
7
  pgvector
8
+ pgvecto_rs[psycopg3]>=0.2.1
8
9
  sqlalchemy
9
10
  redis
10
11
  chromadb
@@ -56,10 +56,10 @@ all = [
56
56
  "weaviate-client",
57
57
  "elasticsearch",
58
58
  "pgvector",
59
+ "pgvecto_rs[psycopg3]>=0.2.2",
59
60
  "sqlalchemy",
60
61
  "redis",
61
62
  "chromadb",
62
- "psycopg2",
63
63
  "psycopg",
64
64
  "psycopg-binary",
65
65
  "opensearch-dsl==2.1.0",
@@ -71,8 +71,10 @@ pinecone = [ "pinecone-client" ]
71
71
  weaviate = [ "weaviate-client" ]
72
72
  elastic = [ "elasticsearch" ]
73
73
  pgvector = [ "psycopg", "psycopg-binary", "pgvector" ]
74
- pgvecto_rs = [ "psycopg2" ]
74
+ pgvectorscale = [ "psycopg", "psycopg-binary", "pgvector" ]
75
+ pgvecto_rs = [ "pgvecto_rs[psycopg3]>=0.2.2" ]
75
76
  redis = [ "redis" ]
77
+ memorydb = [ "memorydb" ]
76
78
  chromadb = [ "chromadb" ]
77
79
  awsopensearch = [ "awsopensearch" ]
78
80
  zilliz_cloud = []
@@ -30,7 +30,9 @@ class DB(Enum):
30
30
  WeaviateCloud = "WeaviateCloud"
31
31
  PgVector = "PgVector"
32
32
  PgVectoRS = "PgVectoRS"
33
+ PgVectorScale = "PgVectorScale"
33
34
  Redis = "Redis"
35
+ MemoryDB = "MemoryDB"
34
36
  Chroma = "Chroma"
35
37
  AWSOpenSearch = "OpenSearch"
36
38
  Test = "test"
@@ -70,10 +72,18 @@ class DB(Enum):
70
72
  if self == DB.PgVectoRS:
71
73
  from .pgvecto_rs.pgvecto_rs import PgVectoRS
72
74
  return PgVectoRS
75
+
76
+ if self == DB.PgVectorScale:
77
+ from .pgvectorscale.pgvectorscale import PgVectorScale
78
+ return PgVectorScale
73
79
 
74
80
  if self == DB.Redis:
75
81
  from .redis.redis import Redis
76
82
  return Redis
83
+
84
+ if self == DB.MemoryDB:
85
+ from .memorydb.memorydb import MemoryDB
86
+ return MemoryDB
77
87
 
78
88
  if self == DB.Chroma:
79
89
  from .chroma.chroma import ChromaClient
@@ -118,9 +128,17 @@ class DB(Enum):
118
128
  from .pgvecto_rs.config import PgVectoRSConfig
119
129
  return PgVectoRSConfig
120
130
 
131
+ if self == DB.PgVectorScale:
132
+ from .pgvectorscale.config import PgVectorScaleConfig
133
+ return PgVectorScaleConfig
134
+
121
135
  if self == DB.Redis:
122
136
  from .redis.config import RedisConfig
123
137
  return RedisConfig
138
+
139
+ if self == DB.MemoryDB:
140
+ from .memorydb.config import MemoryDBConfig
141
+ return MemoryDBConfig
124
142
 
125
143
  if self == DB.Chroma:
126
144
  from .chroma.config import ChromaConfig
@@ -163,6 +181,10 @@ class DB(Enum):
163
181
  from .aws_opensearch.config import AWSOpenSearchIndexConfig
164
182
  return AWSOpenSearchIndexConfig
165
183
 
184
+ if self == DB.PgVectorScale:
185
+ from .pgvectorscale.config import _pgvectorscale_case_config
186
+ return _pgvectorscale_case_config.get(index_type)
187
+
166
188
  # DB.Pinecone, DB.Chroma, DB.Redis
167
189
  return EmptyDBCaseConfig
168
190
 
@@ -15,6 +15,7 @@ class MetricType(str, Enum):
15
15
  class IndexType(str, Enum):
16
16
  HNSW = "HNSW"
17
17
  DISKANN = "DISKANN"
18
+ STREAMING_DISKANN = "DISKANN"
18
19
  IVFFlat = "IVF_FLAT"
19
20
  IVFSQ8 = "IVF_SQ8"
20
21
  Flat = "FLAT"
@@ -38,6 +39,22 @@ class DBConfig(ABC, BaseModel):
38
39
  """
39
40
 
40
41
  db_label: str = ""
42
+ version: str = ""
43
+ note: str = ""
44
+
45
+ @staticmethod
46
+ def common_short_configs() -> list[str]:
47
+ """
48
+ short input, such as `db_label`, `version`
49
+ """
50
+ return ["version", "db_label"]
51
+
52
+ @staticmethod
53
+ def common_long_configs() -> list[str]:
54
+ """
55
+ long input, such as `note`
56
+ """
57
+ return ["note"]
41
58
 
42
59
  @abstractmethod
43
60
  def to_dict(self) -> dict:
@@ -45,7 +62,10 @@ class DBConfig(ABC, BaseModel):
45
62
 
46
63
  @validator("*")
47
64
  def not_empty_field(cls, v, field):
48
- if field.name == "db_label":
65
+ if (
66
+ field.name in cls.common_short_configs()
67
+ or field.name in cls.common_long_configs()
68
+ ):
49
69
  return v
50
70
  if not v and isinstance(v, (str, SecretStr)):
51
71
  raise ValueError("Empty string!")
@@ -3,7 +3,7 @@ from contextlib import contextmanager
3
3
  import time
4
4
  from typing import Iterable, Type
5
5
  from ..api import VectorDB, DBCaseConfig, DBConfig, IndexType
6
- from .config import AWSOpenSearchConfig, AWSOpenSearchIndexConfig
6
+ from .config import AWSOpenSearchConfig, AWSOpenSearchIndexConfig, AWSOS_Engine
7
7
  from opensearchpy import OpenSearch
8
8
  from opensearchpy.helpers import bulk
9
9
 
@@ -83,7 +83,7 @@ class AWSOpenSearch(VectorDB):
83
83
 
84
84
  @contextmanager
85
85
  def init(self) -> None:
86
- """connect to elasticsearch"""
86
+ """connect to opensearch"""
87
87
  self.client = OpenSearch(**self.db_config)
88
88
 
89
89
  yield
@@ -97,7 +97,7 @@ class AWSOpenSearch(VectorDB):
97
97
  metadata: list[int],
98
98
  **kwargs,
99
99
  ) -> tuple[int, Exception]:
100
- """Insert the embeddings to the elasticsearch."""
100
+ """Insert the embeddings to the opensearch."""
101
101
  assert self.client is not None, "should self.init() first"
102
102
 
103
103
  insert_data = []
@@ -136,13 +136,15 @@ class AWSOpenSearch(VectorDB):
136
136
  body = {
137
137
  "size": k,
138
138
  "query": {"knn": {self.vector_col_name: {"vector": query, "k": k}}},
139
+ **({"filter": {"range": {self.id_col_name: {"gt": filters["id"]}}}} if filters else {})
139
140
  }
140
141
  try:
141
- resp = self.client.search(index=self.index_name, body=body)
142
+ resp = self.client.search(index=self.index_name, body=body,size=k,_source=False,docvalue_fields=[self.id_col_name],stored_fields="_none_",filter_path=[f"hits.hits.fields.{self.id_col_name}"],)
142
143
  log.info(f'Search took: {resp["took"]}')
143
144
  log.info(f'Search shards: {resp["_shards"]}')
144
145
  log.info(f'Search hits total: {resp["hits"]["total"]}')
145
- result = [int(d["_id"]) for d in resp["hits"]["hits"]]
146
+ result = [h["fields"][self.id_col_name][0] for h in resp["hits"]["hits"]]
147
+ #result = [int(d["_id"]) for d in resp["hits"]["hits"]]
146
148
  # log.info(f'success! length={len(res)}')
147
149
 
148
150
  return result
@@ -152,7 +154,46 @@ class AWSOpenSearch(VectorDB):
152
154
 
153
155
  def optimize(self):
154
156
  """optimize will be called between insertion and search in performance cases."""
155
- pass
157
+ # Call refresh first to ensure that all segments are created
158
+ self._refresh_index()
159
+ self._do_force_merge()
160
+ # Call refresh again to ensure that the index is ready after force merge.
161
+ self._refresh_index()
162
+ # ensure that all graphs are loaded in memory and ready for search
163
+ self._load_graphs_to_memory()
164
+
165
+ def _refresh_index(self):
166
+ log.debug(f"Starting refresh for index {self.index_name}")
167
+ SECONDS_WAITING_FOR_REFRESH_API_CALL_SEC = 30
168
+ while True:
169
+ try:
170
+ log.info(f"Starting the Refresh Index..")
171
+ self.client.indices.refresh(index=self.index_name)
172
+ break
173
+ except Exception as e:
174
+ log.info(
175
+ f"Refresh errored out. Sleeping for {SECONDS_WAITING_FOR_REFRESH_API_CALL_SEC} sec and then Retrying : {e}")
176
+ time.sleep(SECONDS_WAITING_FOR_REFRESH_API_CALL_SEC)
177
+ continue
178
+ log.debug(f"Completed refresh for index {self.index_name}")
179
+
180
+ def _do_force_merge(self):
181
+ log.debug(f"Starting force merge for index {self.index_name}")
182
+ force_merge_endpoint = f'/{self.index_name}/_forcemerge?max_num_segments=1&wait_for_completion=false'
183
+ force_merge_task_id = self.client.transport.perform_request('POST', force_merge_endpoint)['task']
184
+ SECONDS_WAITING_FOR_FORCE_MERGE_API_CALL_SEC = 30
185
+ while True:
186
+ time.sleep(SECONDS_WAITING_FOR_FORCE_MERGE_API_CALL_SEC)
187
+ task_status = self.client.tasks.get(task_id=force_merge_task_id)
188
+ if task_status['completed']:
189
+ break
190
+ log.debug(f"Completed force merge for index {self.index_name}")
191
+
192
+ def _load_graphs_to_memory(self):
193
+ if self.case_config.engine != AWSOS_Engine.lucene:
194
+ log.info("Calling warmup API to load graphs into memory")
195
+ warmup_endpoint = f'/_plugins/_knn/warmup/{self.index_name}'
196
+ self.client.transport.perform_request('GET', warmup_endpoint)
156
197
 
157
198
  def ready_to_load(self):
158
199
  """ready_to_load will be called before load in load cases."""
@@ -1,9 +1,10 @@
1
+ import logging
1
2
  from enum import Enum
2
3
  from pydantic import SecretStr, BaseModel
3
4
 
4
5
  from ..api import DBConfig, DBCaseConfig, MetricType, IndexType
5
6
 
6
-
7
+ log = logging.getLogger(__name__)
7
8
  class AWSOpenSearchConfig(DBConfig, BaseModel):
8
9
  host: str = ""
9
10
  port: int = 443
@@ -31,14 +32,18 @@ class AWSOS_Engine(Enum):
31
32
 
32
33
  class AWSOpenSearchIndexConfig(BaseModel, DBCaseConfig):
33
34
  metric_type: MetricType = MetricType.L2
34
- engine: AWSOS_Engine = AWSOS_Engine.nmslib
35
- efConstruction: int = 360
36
- M: int = 30
35
+ engine: AWSOS_Engine = AWSOS_Engine.faiss
36
+ efConstruction: int = 256
37
+ efSearch: int = 256
38
+ M: int = 16
37
39
 
38
40
  def parse_metric(self) -> str:
39
41
  if self.metric_type == MetricType.IP:
40
- return "innerproduct" # only support faiss / nmslib, not for Lucene.
42
+ return "innerproduct"
41
43
  elif self.metric_type == MetricType.COSINE:
44
+ if self.engine == AWSOS_Engine.faiss:
45
+ log.info(f"Using metric type as innerproduct because faiss doesn't support cosine as metric type for Opensearch")
46
+ return "innerproduct"
42
47
  return "cosinesimil"
43
48
  return "l2"
44
49
 
@@ -49,7 +54,8 @@ class AWSOpenSearchIndexConfig(BaseModel, DBCaseConfig):
49
54
  "engine": self.engine.value,
50
55
  "parameters": {
51
56
  "ef_construction": self.efConstruction,
52
- "m": self.M
57
+ "m": self.M,
58
+ "ef_search": self.efSearch
53
59
  }
54
60
  }
55
61
  return params
@@ -40,12 +40,12 @@ def create_index(client, index_name):
40
40
  "type": "knn_vector",
41
41
  "dimension": _DIM,
42
42
  "method": {
43
- "engine": "nmslib",
43
+ "engine": "faiss",
44
44
  "name": "hnsw",
45
45
  "space_type": "l2",
46
46
  "parameters": {
47
- "ef_construction": 128,
48
- "m": 24,
47
+ "ef_construction": 256,
48
+ "m": 16,
49
49
  }
50
50
  }
51
51
  }
@@ -108,12 +108,43 @@ def search(client, index_name):
108
108
  print('\nSearch not ready, sleep 1s')
109
109
  time.sleep(1)
110
110
 
111
+ def optimize_index(client, index_name):
112
+ print(f"Starting force merge for index {index_name}")
113
+ force_merge_endpoint = f'/{index_name}/_forcemerge?max_num_segments=1&wait_for_completion=false'
114
+ force_merge_task_id = client.transport.perform_request('POST', force_merge_endpoint)['task']
115
+ SECONDS_WAITING_FOR_FORCE_MERGE_API_CALL_SEC = 30
116
+ while True:
117
+ time.sleep(SECONDS_WAITING_FOR_FORCE_MERGE_API_CALL_SEC)
118
+ task_status = client.tasks.get(task_id=force_merge_task_id)
119
+ if task_status['completed']:
120
+ break
121
+ print(f"Completed force merge for index {index_name}")
122
+
123
+
124
+ def refresh_index(client, index_name):
125
+ print(f"Starting refresh for index {index_name}")
126
+ SECONDS_WAITING_FOR_REFRESH_API_CALL_SEC = 30
127
+ while True:
128
+ try:
129
+ print(f"Starting the Refresh Index..")
130
+ client.indices.refresh(index=index_name)
131
+ break
132
+ except Exception as e:
133
+ print(
134
+ f"Refresh errored out. Sleeping for {SECONDS_WAITING_FOR_REFRESH_API_CALL_SEC} sec and then Retrying : {e}")
135
+ time.sleep(SECONDS_WAITING_FOR_REFRESH_API_CALL_SEC)
136
+ continue
137
+ print(f"Completed refresh for index {index_name}")
138
+
139
+
111
140
 
112
141
  def main():
113
142
  client = create_client()
114
143
  try:
115
144
  create_index(client, _INDEX_NAME)
116
145
  bulk_insert(client, _INDEX_NAME)
146
+ optimize_index(client, _INDEX_NAME)
147
+ refresh_index(client, _INDEX_NAME)
117
148
  search(client, _INDEX_NAME)
118
149
  delete_index(client, _INDEX_NAME)
119
150
  except Exception as e:
@@ -0,0 +1,88 @@
1
+ from typing import Annotated, TypedDict, Unpack
2
+
3
+ import click
4
+ from pydantic import SecretStr
5
+
6
+ from ....cli.cli import (
7
+ CommonTypedDict,
8
+ HNSWFlavor2,
9
+ cli,
10
+ click_parameter_decorators_from_typed_dict,
11
+ run,
12
+ )
13
+ from .. import DB
14
+
15
+
16
+ class MemoryDBTypedDict(TypedDict):
17
+ host: Annotated[
18
+ str, click.option("--host", type=str, help="Db host", required=True)
19
+ ]
20
+ password: Annotated[str, click.option("--password", type=str, help="Db password")]
21
+ port: Annotated[int, click.option("--port", type=int, default=6379, help="Db Port")]
22
+ ssl: Annotated[
23
+ bool,
24
+ click.option(
25
+ "--ssl/--no-ssl",
26
+ is_flag=True,
27
+ show_default=True,
28
+ default=True,
29
+ help="Enable or disable SSL for MemoryDB",
30
+ ),
31
+ ]
32
+ ssl_ca_certs: Annotated[
33
+ str,
34
+ click.option(
35
+ "--ssl-ca-certs",
36
+ show_default=True,
37
+ help="Path to certificate authority file to use for SSL",
38
+ ),
39
+ ]
40
+ cmd: Annotated[
41
+ bool,
42
+ click.option(
43
+ "--cmd",
44
+ is_flag=True,
45
+ show_default=True,
46
+ default=False,
47
+ help="Cluster Mode Disabled (CMD), use this flag when testing locally on a single node instance. In production, MemoryDB only supports cluster mode (CME)",
48
+ ),
49
+ ]
50
+ insert_batch_size: Annotated[
51
+ int,
52
+ click.option(
53
+ "--insert-batch-size",
54
+ type=int,
55
+ default=10,
56
+ help="Batch size for inserting data. Adjust this as needed, but don't make it too big",
57
+ ),
58
+ ]
59
+
60
+
61
+ class MemoryDBHNSWTypedDict(CommonTypedDict, MemoryDBTypedDict, HNSWFlavor2):
62
+ ...
63
+
64
+
65
+ @cli.command()
66
+ @click_parameter_decorators_from_typed_dict(MemoryDBHNSWTypedDict)
67
+ def MemoryDB(**parameters: Unpack[MemoryDBHNSWTypedDict]):
68
+ from .config import MemoryDBConfig, MemoryDBHNSWConfig
69
+
70
+ run(
71
+ db=DB.MemoryDB,
72
+ db_config=MemoryDBConfig(
73
+ db_label=parameters["db_label"],
74
+ password=SecretStr(parameters["password"]) if parameters["password"] else None,
75
+ host=SecretStr(parameters["host"]),
76
+ port=parameters["port"],
77
+ ssl=parameters["ssl"],
78
+ ssl_ca_certs=parameters["ssl_ca_certs"],
79
+ cmd=parameters["cmd"],
80
+ ),
81
+ db_case_config=MemoryDBHNSWConfig(
82
+ M=parameters["m"],
83
+ ef_construction=parameters["ef_construction"],
84
+ ef_runtime=parameters["ef_runtime"],
85
+ insert_batch_size=parameters["insert_batch_size"]
86
+ ),
87
+ **parameters,
88
+ )
@@ -0,0 +1,54 @@
1
+ from pydantic import BaseModel, SecretStr
2
+
3
+ from ..api import DBCaseConfig, DBConfig, IndexType, MetricType
4
+
5
+
6
+ class MemoryDBConfig(DBConfig):
7
+ host: SecretStr
8
+ password: SecretStr | None = None
9
+ port: int | None = None
10
+ ssl: bool | None = None
11
+ cmd: bool | None = None
12
+ ssl_ca_certs: str | None = None
13
+
14
+ def to_dict(self) -> dict:
15
+ return {
16
+ "host": self.host.get_secret_value(),
17
+ "port": self.port,
18
+ "password": self.password.get_secret_value() if self.password else None,
19
+ "ssl": self.ssl,
20
+ "cmd": self.cmd,
21
+ "ssl_ca_certs": self.ssl_ca_certs,
22
+ }
23
+
24
+
25
+ class MemoryDBIndexConfig(BaseModel, DBCaseConfig):
26
+ metric_type: MetricType | None = None
27
+ insert_batch_size: int | None = None
28
+
29
+ def parse_metric(self) -> str:
30
+ if self.metric_type == MetricType.L2:
31
+ return "l2"
32
+ elif self.metric_type == MetricType.IP:
33
+ return "ip"
34
+ return "cosine"
35
+
36
+
37
+ class MemoryDBHNSWConfig(MemoryDBIndexConfig):
38
+ M: int | None = 16
39
+ ef_construction: int | None = 64
40
+ ef_runtime: int | None = 10
41
+ index: IndexType = IndexType.HNSW
42
+
43
+ def index_param(self) -> dict:
44
+ return {
45
+ "metric": self.parse_metric(),
46
+ "index_type": self.index.value,
47
+ "m": self.M,
48
+ "ef_construction": self.ef_construction,
49
+ }
50
+
51
+ def search_param(self) -> dict:
52
+ return {
53
+ "ef_runtime": self.ef_runtime,
54
+ }