vectordb-bench 1.0.4__tar.gz → 1.0.5__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 (228) hide show
  1. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/PKG-INFO +1 -1
  2. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/pyproject.toml +1 -0
  3. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/cases.py +45 -1
  4. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/__init__.py +32 -0
  5. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/milvus/cli.py +4 -9
  6. vectordb_bench-1.0.5/vectordb_bench/backend/clients/oss_opensearch/cli.py +155 -0
  7. vectordb_bench-1.0.5/vectordb_bench/backend/clients/oss_opensearch/config.py +157 -0
  8. vectordb_bench-1.0.5/vectordb_bench/backend/clients/oss_opensearch/oss_opensearch.py +582 -0
  9. vectordb_bench-1.0.5/vectordb_bench/backend/clients/oss_opensearch/run.py +166 -0
  10. vectordb_bench-1.0.5/vectordb_bench/backend/clients/s3_vectors/config.py +41 -0
  11. vectordb_bench-1.0.5/vectordb_bench/backend/clients/s3_vectors/s3_vectors.py +171 -0
  12. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/tidb/cli.py +0 -4
  13. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/tidb/config.py +22 -2
  14. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/dataset.py +70 -0
  15. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/filter.py +17 -0
  16. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/runner/mp_runner.py +4 -0
  17. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/runner/read_write_runner.py +10 -9
  18. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/runner/serial_runner.py +23 -7
  19. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/task_runner.py +5 -4
  20. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/cli/vectordbbench.py +2 -0
  21. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/frontend/components/check_results/filters.py +1 -4
  22. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/frontend/components/check_results/nav.py +2 -1
  23. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/frontend/components/concurrent/charts.py +5 -0
  24. vectordb_bench-1.0.5/vectordb_bench/frontend/components/label_filter/charts.py +60 -0
  25. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/frontend/components/streaming/data.py +7 -0
  26. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/frontend/components/welcome/welcomePrams.py +42 -4
  27. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/frontend/config/dbCaseConfigs.py +60 -13
  28. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/frontend/config/styles.py +3 -0
  29. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/frontend/pages/concurrent.py +1 -1
  30. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/frontend/pages/custom.py +1 -1
  31. vectordb_bench-1.0.5/vectordb_bench/frontend/pages/int_filter.py +56 -0
  32. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/frontend/pages/streaming.py +16 -3
  33. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/metric.py +7 -0
  34. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/models.py +36 -4
  35. vectordb_bench-1.0.5/vectordb_bench/results/S3Vectors/result_20250722_standard_s3vectors.json +2509 -0
  36. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench.egg-info/PKG-INFO +1 -1
  37. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench.egg-info/SOURCES.txt +22 -13
  38. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/.devcontainer/Dockerfile +0 -0
  39. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/.devcontainer/devcontainer.json +0 -0
  40. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/.env.example +0 -0
  41. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/.github/workflows/publish_package_on_release.yml +0 -0
  42. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/.github/workflows/pull_request.yml +0 -0
  43. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/.gitignore +0 -0
  44. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/Dockerfile +0 -0
  45. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/LICENSE +0 -0
  46. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/Makefile +0 -0
  47. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/OWNERS +0 -0
  48. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/README.md +0 -0
  49. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/install/requirements_py3.11.txt +0 -0
  50. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/install.py +0 -0
  51. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/setup.cfg +0 -0
  52. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/tests/conftest.py +0 -0
  53. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/tests/pytest.ini +0 -0
  54. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/tests/test_bench_runner.py +0 -0
  55. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/tests/test_chroma.py +0 -0
  56. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/tests/test_data_source.py +0 -0
  57. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/tests/test_dataset.py +0 -0
  58. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/tests/test_elasticsearch_cloud.py +0 -0
  59. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/tests/test_models.py +0 -0
  60. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/tests/test_rate_runner.py +0 -0
  61. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/tests/test_redis.py +0 -0
  62. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/tests/test_utils.py +0 -0
  63. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/tests/ut_cases.py +0 -0
  64. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/__init__.py +0 -0
  65. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/__main__.py +0 -0
  66. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/__init__.py +0 -0
  67. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/assembler.py +0 -0
  68. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/aliyun_elasticsearch/aliyun_elasticsearch.py +0 -0
  69. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/aliyun_elasticsearch/config.py +0 -0
  70. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/aliyun_opensearch/aliyun_opensearch.py +0 -0
  71. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/aliyun_opensearch/config.py +0 -0
  72. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/alloydb/alloydb.py +0 -0
  73. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/alloydb/cli.py +0 -0
  74. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/alloydb/config.py +0 -0
  75. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/api.py +0 -0
  76. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/aws_opensearch/aws_opensearch.py +0 -0
  77. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/aws_opensearch/cli.py +0 -0
  78. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/aws_opensearch/config.py +0 -0
  79. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/aws_opensearch/run.py +0 -0
  80. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/chroma/chroma.py +0 -0
  81. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/chroma/config.py +0 -0
  82. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/clickhouse/cli.py +0 -0
  83. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/clickhouse/clickhouse.py +0 -0
  84. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/clickhouse/config.py +0 -0
  85. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/elastic_cloud/config.py +0 -0
  86. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/elastic_cloud/elastic_cloud.py +0 -0
  87. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/lancedb/cli.py +0 -0
  88. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/lancedb/config.py +0 -0
  89. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/lancedb/lancedb.py +0 -0
  90. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/mariadb/cli.py +0 -0
  91. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/mariadb/config.py +0 -0
  92. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/mariadb/mariadb.py +0 -0
  93. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/memorydb/cli.py +0 -0
  94. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/memorydb/config.py +0 -0
  95. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/memorydb/memorydb.py +0 -0
  96. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/milvus/config.py +0 -0
  97. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/milvus/milvus.py +0 -0
  98. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/mongodb/config.py +0 -0
  99. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/mongodb/mongodb.py +0 -0
  100. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/oceanbase/cli.py +0 -0
  101. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/oceanbase/config.py +0 -0
  102. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/oceanbase/oceanbase.py +0 -0
  103. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/pgdiskann/cli.py +0 -0
  104. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/pgdiskann/config.py +0 -0
  105. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/pgdiskann/pgdiskann.py +0 -0
  106. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/pgvecto_rs/cli.py +0 -0
  107. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/pgvecto_rs/config.py +0 -0
  108. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/pgvecto_rs/pgvecto_rs.py +0 -0
  109. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/pgvector/cli.py +0 -0
  110. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/pgvector/config.py +0 -0
  111. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/pgvector/pgvector.py +0 -0
  112. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/pgvectorscale/cli.py +0 -0
  113. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/pgvectorscale/config.py +0 -0
  114. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/pgvectorscale/pgvectorscale.py +0 -0
  115. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/pinecone/config.py +0 -0
  116. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/pinecone/pinecone.py +0 -0
  117. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/qdrant_cloud/cli.py +0 -0
  118. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/qdrant_cloud/config.py +0 -0
  119. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/qdrant_cloud/qdrant_cloud.py +0 -0
  120. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/qdrant_local/cli.py +0 -0
  121. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/qdrant_local/config.py +0 -0
  122. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/qdrant_local/qdrant_local.py +0 -0
  123. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/redis/cli.py +0 -0
  124. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/redis/config.py +0 -0
  125. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/redis/redis.py +0 -0
  126. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/test/cli.py +0 -0
  127. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/test/config.py +0 -0
  128. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/test/test.py +0 -0
  129. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/tidb/tidb.py +0 -0
  130. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/vespa/cli.py +0 -0
  131. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/vespa/config.py +0 -0
  132. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/vespa/util.py +0 -0
  133. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/vespa/vespa.py +0 -0
  134. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/weaviate_cloud/cli.py +0 -0
  135. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/weaviate_cloud/config.py +0 -0
  136. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/weaviate_cloud/weaviate_cloud.py +0 -0
  137. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/zilliz_cloud/cli.py +0 -0
  138. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/zilliz_cloud/config.py +0 -0
  139. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/clients/zilliz_cloud/zilliz_cloud.py +0 -0
  140. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/data_source.py +0 -0
  141. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/result_collector.py +0 -0
  142. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/runner/__init__.py +0 -0
  143. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/runner/rate_runner.py +0 -0
  144. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/runner/util.py +0 -0
  145. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/backend/utils.py +0 -0
  146. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/base.py +0 -0
  147. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/cli/__init__.py +0 -0
  148. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/cli/batch_cli.py +0 -0
  149. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/cli/cli.py +0 -0
  150. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/config-files/batch_sample_config.yml +0 -0
  151. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/config-files/sample_config.yml +0 -0
  152. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/custom/custom_case.json +0 -0
  153. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5/vectordb_bench}/fig/custom_case_run_test.png +0 -0
  154. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5/vectordb_bench}/fig/custom_dataset.png +0 -0
  155. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5/vectordb_bench}/fig/homepage/bar-chart.png +0 -0
  156. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5/vectordb_bench}/fig/homepage/concurrent.png +0 -0
  157. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5/vectordb_bench}/fig/homepage/custom.png +0 -0
  158. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5/vectordb_bench}/fig/homepage/label_filter.png +0 -0
  159. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5/vectordb_bench}/fig/homepage/qp$.png +0 -0
  160. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5/vectordb_bench}/fig/homepage/run_test.png +0 -0
  161. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5/vectordb_bench}/fig/homepage/streaming.png +0 -0
  162. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5/vectordb_bench}/fig/homepage/table.png +0 -0
  163. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5/vectordb_bench}/fig/run_test_select_case.png +0 -0
  164. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5/vectordb_bench}/fig/run_test_select_db.png +0 -0
  165. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5/vectordb_bench}/fig/run_test_submit.png +0 -0
  166. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/frontend/components/check_results/charts.py +0 -0
  167. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/frontend/components/check_results/data.py +0 -0
  168. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/frontend/components/check_results/expanderStyle.py +0 -0
  169. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/frontend/components/check_results/footer.py +0 -0
  170. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/frontend/components/check_results/headerIcon.py +0 -0
  171. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/frontend/components/check_results/priceTable.py +0 -0
  172. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/frontend/components/check_results/stPageConfig.py +0 -0
  173. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/frontend/components/custom/displayCustomCase.py +0 -0
  174. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/frontend/components/custom/displaypPrams.py +0 -0
  175. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/frontend/components/custom/getCustomConfig.py +0 -0
  176. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/frontend/components/custom/initStyle.py +0 -0
  177. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/frontend/components/get_results/saveAsImage.py +0 -0
  178. {vectordb_bench-1.0.4/vectordb_bench/frontend/components/label_filter → vectordb_bench-1.0.5/vectordb_bench/frontend/components/int_filter}/charts.py +0 -0
  179. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/frontend/components/run_test/autoRefresh.py +0 -0
  180. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/frontend/components/run_test/caseSelector.py +0 -0
  181. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/frontend/components/run_test/dbConfigSetting.py +0 -0
  182. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/frontend/components/run_test/dbSelector.py +0 -0
  183. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/frontend/components/run_test/generateTasks.py +0 -0
  184. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/frontend/components/run_test/hideSidebar.py +0 -0
  185. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/frontend/components/run_test/initStyle.py +0 -0
  186. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/frontend/components/run_test/inputWidget.py +0 -0
  187. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/frontend/components/run_test/submitTask.py +0 -0
  188. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/frontend/components/streaming/charts.py +0 -0
  189. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/frontend/components/tables/data.py +0 -0
  190. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/frontend/components/welcome/explainPrams.py +0 -0
  191. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/frontend/components/welcome/pagestyle.py +0 -0
  192. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/frontend/config/dbPrices.py +0 -0
  193. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/frontend/pages/label_filter.py +0 -0
  194. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/frontend/pages/quries_per_dollar.py +0 -0
  195. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/frontend/pages/results.py +0 -0
  196. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/frontend/pages/run_test.py +0 -0
  197. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/frontend/pages/tables.py +0 -0
  198. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/frontend/utils.py +0 -0
  199. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/frontend/vdbbench.py +0 -0
  200. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/interface.py +0 -0
  201. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/log_util.py +0 -0
  202. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/results/ElasticCloud/result_20230727_standard_elasticcloud.json +0 -0
  203. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/results/ElasticCloud/result_20230808_standard_elasticcloud.json +0 -0
  204. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/results/ElasticCloud/result_20250318_standard_elasticcloud.json +0 -0
  205. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/results/Milvus/result_20230727_standard_milvus.json +0 -0
  206. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/results/Milvus/result_20230808_standard_milvus.json +0 -0
  207. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/results/Milvus/result_20250509_standard_milvus.json +0 -0
  208. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/results/OpenSearch/result_20250224_standard_opensearch.json +0 -0
  209. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/results/PgVector/result_20230727_standard_pgvector.json +0 -0
  210. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/results/PgVector/result_20230808_standard_pgvector.json +0 -0
  211. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/results/Pinecone/result_20230727_standard_pinecone.json +0 -0
  212. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/results/Pinecone/result_20230808_standard_pinecone.json +0 -0
  213. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/results/Pinecone/result_20250124_standard_pinecone.json +0 -0
  214. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/results/QdrantCloud/result_20230727_standard_qdrantcloud.json +0 -0
  215. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/results/QdrantCloud/result_20230808_standard_qdrantcloud.json +0 -0
  216. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/results/QdrantCloud/result_20250602_standard_qdrantcloud.json +0 -0
  217. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/results/WeaviateCloud/result_20230727_standard_weaviatecloud.json +0 -0
  218. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/results/WeaviateCloud/result_20230808_standard_weaviatecloud.json +0 -0
  219. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/results/ZillizCloud/result_20250613_standard_zillizcloud.json +0 -0
  220. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/results/dbPrices.json +0 -0
  221. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/results/getLeaderboardData.py +0 -0
  222. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/results/getLeaderboardDataV2.py +0 -0
  223. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/results/leaderboard.json +0 -0
  224. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench/results/leaderboard_v2.json +0 -0
  225. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench.egg-info/dependency_links.txt +0 -0
  226. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench.egg-info/entry_points.txt +0 -0
  227. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/vectordb_bench.egg-info/requires.txt +0 -0
  228. {vectordb_bench-1.0.4 → vectordb_bench-1.0.5}/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: 1.0.4
3
+ Version: 1.0.5
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
@@ -4,6 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [tool.setuptools.package-data]
6
6
  "vectordb_bench.results" = ["*.json"]
7
+ "vectordb_bench.fig.homepage" = ["*.png"]
7
8
 
8
9
  [tool.setuptools.packages.find]
9
10
  where = ["."]
@@ -4,7 +4,7 @@ from enum import Enum, auto
4
4
 
5
5
  from vectordb_bench import config
6
6
  from vectordb_bench.backend.clients.api import MetricType
7
- from vectordb_bench.backend.filter import Filter, FilterOp, IntFilter, LabelFilter, NonFilter, non_filter
7
+ from vectordb_bench.backend.filter import Filter, FilterOp, IntFilter, LabelFilter, NewIntFilter, NonFilter, non_filter
8
8
  from vectordb_bench.base import BaseModel
9
9
  from vectordb_bench.frontend.components.custom.getCustomConfig import CustomDatasetConfig
10
10
 
@@ -54,6 +54,8 @@ class CaseType(Enum):
54
54
 
55
55
  LabelFilterPerformanceCase = 300
56
56
 
57
+ NewIntFilterPerformanceCase = 400
58
+
57
59
  def case_cls(self, custom_configs: dict | None = None) -> type["Case"]:
58
60
  if custom_configs is None:
59
61
  return type2case.get(self)()
@@ -130,6 +132,7 @@ class PerformanceCase(Case):
130
132
  filter_rate: float | None = None
131
133
  load_timeout: float | int = config.LOAD_TIMEOUT_DEFAULT
132
134
  optimize_timeout: float | int | None = config.OPTIMIZE_TIMEOUT_DEFAULT
135
+ int_value: float | None = None
133
136
 
134
137
 
135
138
  class CapacityDim960(CapacityCase):
@@ -471,6 +474,46 @@ class StreamingPerformanceCase(Case):
471
474
  )
472
475
 
473
476
 
477
+ class NewIntFilterPerformanceCase(PerformanceCase):
478
+ case_id: CaseType = CaseType.NewIntFilterPerformanceCase
479
+ dataset_with_size_type: DatasetWithSizeType
480
+ filter_rate: float
481
+
482
+ def __init__(
483
+ self,
484
+ dataset_with_size_type: DatasetWithSizeType | str,
485
+ filter_rate: float,
486
+ int_value: float | None = 0,
487
+ **kwargs,
488
+ ):
489
+ if not isinstance(dataset_with_size_type, DatasetWithSizeType):
490
+ dataset_with_size_type = DatasetWithSizeType(dataset_with_size_type)
491
+ name = f"Int-Filter-{filter_rate*100:.1f}% - {dataset_with_size_type.value}"
492
+ description = f"Int-Filter-{filter_rate*100:.1f}% Performance Test ({dataset_with_size_type.value})"
493
+ dataset = dataset_with_size_type.get_manager()
494
+ load_timeout = dataset_with_size_type.get_load_timeout()
495
+ optimize_timeout = dataset_with_size_type.get_optimize_timeout()
496
+ filters = IntFilter(filter_rate=filter_rate, int_value=int_value)
497
+ filter_rate = filters.filter_rate
498
+ super().__init__(
499
+ name=name,
500
+ description=description,
501
+ dataset=dataset,
502
+ load_timeout=load_timeout,
503
+ optimize_timeout=optimize_timeout,
504
+ filter_rate=filter_rate,
505
+ int_value=int_value,
506
+ dataset_with_size_type=dataset_with_size_type,
507
+ **kwargs,
508
+ )
509
+
510
+ @property
511
+ def filters(self) -> Filter:
512
+ int_field = self.dataset.data.train_id_field
513
+ int_value = int(self.dataset.data.size * self.filter_rate)
514
+ return NewIntFilter(filter_rate=self.filter_rate, int_field=int_field, int_value=int_value)
515
+
516
+
474
517
  class LabelFilterPerformanceCase(PerformanceCase):
475
518
  case_id: CaseType = CaseType.LabelFilterPerformanceCase
476
519
  dataset_with_size_type: DatasetWithSizeType
@@ -529,5 +572,6 @@ type2case = {
529
572
  CaseType.Performance1536D50K: Performance1536D50K,
530
573
  CaseType.PerformanceCustomDataset: PerformanceCustomDataset,
531
574
  CaseType.StreamingPerformanceCase: StreamingPerformanceCase,
575
+ CaseType.NewIntFilterPerformanceCase: NewIntFilterPerformanceCase,
532
576
  CaseType.LabelFilterPerformanceCase: LabelFilterPerformanceCase,
533
577
  }
@@ -38,6 +38,7 @@ class DB(Enum):
38
38
  MemoryDB = "MemoryDB"
39
39
  Chroma = "Chroma"
40
40
  AWSOpenSearch = "OpenSearch"
41
+ OSSOpenSearch = "OSSOpenSearch"
41
42
  AliyunElasticsearch = "AliyunElasticsearch"
42
43
  MariaDB = "MariaDB"
43
44
  Test = "test"
@@ -48,6 +49,7 @@ class DB(Enum):
48
49
  Vespa = "Vespa"
49
50
  LanceDB = "LanceDB"
50
51
  OceanBase = "OceanBase"
52
+ S3Vectors = "S3Vectors"
51
53
 
52
54
  @property
53
55
  def init_cls(self) -> type[VectorDB]: # noqa: PLR0911, PLR0912, C901, PLR0915
@@ -127,6 +129,11 @@ class DB(Enum):
127
129
 
128
130
  return AWSOpenSearch
129
131
 
132
+ if self == DB.OSSOpenSearch:
133
+ from .oss_opensearch.oss_opensearch import OSSOpenSearch
134
+
135
+ return OSSOpenSearch
136
+
130
137
  if self == DB.Clickhouse:
131
138
  from .clickhouse.clickhouse import Clickhouse
132
139
 
@@ -182,6 +189,11 @@ class DB(Enum):
182
189
 
183
190
  return LanceDB
184
191
 
192
+ if self == DB.S3Vectors:
193
+ from .s3_vectors.s3_vectors import S3Vectors
194
+
195
+ return S3Vectors
196
+
185
197
  msg = f"Unknown DB: {self.name}"
186
198
  raise ValueError(msg)
187
199
 
@@ -263,6 +275,11 @@ class DB(Enum):
263
275
 
264
276
  return AWSOpenSearchConfig
265
277
 
278
+ if self == DB.OSSOpenSearch:
279
+ from .oss_opensearch.config import OSSOpenSearchConfig
280
+
281
+ return OSSOpenSearchConfig
282
+
266
283
  if self == DB.Clickhouse:
267
284
  from .clickhouse.config import ClickhouseConfig
268
285
 
@@ -318,6 +335,11 @@ class DB(Enum):
318
335
 
319
336
  return LanceDBConfig
320
337
 
338
+ if self == DB.S3Vectors:
339
+ from .s3_vectors.config import S3VectorsConfig
340
+
341
+ return S3VectorsConfig
342
+
321
343
  msg = f"Unknown DB: {self.name}"
322
344
  raise ValueError(msg)
323
345
 
@@ -370,6 +392,11 @@ class DB(Enum):
370
392
 
371
393
  return AWSOpenSearchIndexConfig
372
394
 
395
+ if self == DB.OSSOpenSearch:
396
+ from .oss_opensearch.config import OSSOpenSearchIndexConfig
397
+
398
+ return OSSOpenSearchIndexConfig
399
+
373
400
  if self == DB.Clickhouse:
374
401
  from .clickhouse.config import ClickhouseHNSWConfig
375
402
 
@@ -430,6 +457,11 @@ class DB(Enum):
430
457
 
431
458
  return _lancedb_case_config.get(index_type)
432
459
 
460
+ if self == DB.S3Vectors:
461
+ from .s3_vectors.config import S3VectorsIndexConfig
462
+
463
+ return S3VectorsIndexConfig
464
+
433
465
  # DB.Pinecone, DB.Chroma, DB.Redis
434
466
  return EmptyDBCaseConfig
435
467
 
@@ -139,19 +139,14 @@ class MilvusRefineTypedDict(TypedDict):
139
139
  ]
140
140
 
141
141
 
142
- class MilvusHNSWPQTypedDict(
143
- CommonTypedDict,
144
- MilvusTypedDict,
145
- MilvusHNSWTypedDict,
146
- MilvusRefineTypedDict
147
- ):
142
+ class MilvusHNSWPQTypedDict(CommonTypedDict, MilvusTypedDict, MilvusHNSWTypedDict, MilvusRefineTypedDict):
148
143
  nbits: Annotated[
149
144
  int,
150
145
  click.option(
151
146
  "--nbits",
152
147
  type=int,
153
148
  required=True,
154
- )
149
+ ),
155
150
  ]
156
151
 
157
152
 
@@ -194,7 +189,7 @@ class MilvusHNSWPRQTypedDict(
194
189
  type=int,
195
190
  help="The number of residual subquantizers.",
196
191
  required=True,
197
- )
192
+ ),
198
193
  ]
199
194
 
200
195
 
@@ -220,7 +215,7 @@ def MilvusHNSWPRQ(**parameters: Unpack[MilvusHNSWPRQTypedDict]):
220
215
  refine=parameters["refine"],
221
216
  refine_type=parameters["refine_type"],
222
217
  refine_k=parameters["refine_k"],
223
- nrq=parameters["nrq"]
218
+ nrq=parameters["nrq"],
224
219
  ),
225
220
  **parameters,
226
221
  )
@@ -0,0 +1,155 @@
1
+ import logging
2
+ from typing import Annotated, TypedDict, Unpack
3
+
4
+ import click
5
+ from pydantic import SecretStr
6
+
7
+ from ....cli.cli import (
8
+ CommonTypedDict,
9
+ HNSWFlavor1,
10
+ cli,
11
+ click_parameter_decorators_from_typed_dict,
12
+ run,
13
+ )
14
+ from .. import DB
15
+ from .config import OSSOpenSearchQuantization, OSSOS_Engine
16
+
17
+ log = logging.getLogger(__name__)
18
+
19
+
20
+ class OSSOpenSearchTypedDict(TypedDict):
21
+ host: Annotated[str, click.option("--host", type=str, help="Db host", required=True)]
22
+ port: Annotated[int, click.option("--port", type=int, default=80, help="Db Port")]
23
+ user: Annotated[str, click.option("--user", type=str, help="Db User")]
24
+ password: Annotated[str, click.option("--password", type=str, help="Db password")]
25
+ number_of_shards: Annotated[
26
+ int,
27
+ click.option("--number-of-shards", type=int, help="Number of primary shards for the index", default=1),
28
+ ]
29
+ number_of_replicas: Annotated[
30
+ int,
31
+ click.option(
32
+ "--number-of-replicas", type=int, help="Number of replica copies for each primary shard", default=1
33
+ ),
34
+ ]
35
+ index_thread_qty: Annotated[
36
+ int,
37
+ click.option(
38
+ "--index-thread-qty",
39
+ type=int,
40
+ help="Thread count for native engine indexing",
41
+ default=4,
42
+ ),
43
+ ]
44
+
45
+ engine: Annotated[
46
+ str,
47
+ click.option(
48
+ "--engine",
49
+ type=click.Choice(["nmslib", "faiss", "lucene"], case_sensitive=False),
50
+ help="HNSW algorithm implementation to use",
51
+ default="faiss",
52
+ ),
53
+ ]
54
+
55
+ metric_type: Annotated[
56
+ str,
57
+ click.option(
58
+ "--metric-type",
59
+ type=click.Choice(["l2", "cosine", "ip"], case_sensitive=False),
60
+ help="Distance metric type for vector similarity",
61
+ default="l2",
62
+ ),
63
+ ]
64
+
65
+ number_of_segments: Annotated[
66
+ int,
67
+ click.option("--number-of-segments", type=int, help="Target number of segments after merging", default=1),
68
+ ]
69
+
70
+ refresh_interval: Annotated[
71
+ str,
72
+ click.option(
73
+ "--refresh-interval", type=str, help="How often to make new data available for search", default="60s"
74
+ ),
75
+ ]
76
+
77
+ force_merge_enabled: Annotated[
78
+ bool,
79
+ click.option("--force-merge-enabled", type=bool, help="Whether to perform force merge operation", default=True),
80
+ ]
81
+
82
+ flush_threshold_size: Annotated[
83
+ str,
84
+ click.option(
85
+ "--flush-threshold-size", type=str, help="Size threshold for flushing the transaction log", default="5120mb"
86
+ ),
87
+ ]
88
+
89
+ cb_threshold: Annotated[
90
+ str,
91
+ click.option(
92
+ "--cb-threshold",
93
+ type=str,
94
+ help="k-NN Memory circuit breaker threshold",
95
+ default="50%",
96
+ ),
97
+ ]
98
+
99
+ quantization_type: Annotated[
100
+ str | None,
101
+ click.option(
102
+ "--quantization-type",
103
+ type=click.Choice(["fp32", "fp16"]),
104
+ help="quantization type for vectors (in index)",
105
+ default="fp32",
106
+ required=False,
107
+ ),
108
+ ]
109
+
110
+ engine: Annotated[
111
+ str | None,
112
+ click.option(
113
+ "--engine",
114
+ type=click.Choice(["faiss", "lucene"]),
115
+ help="quantization type for vectors (in index)",
116
+ default="faiss",
117
+ required=False,
118
+ ),
119
+ ]
120
+
121
+
122
+ class OSSOpenSearchHNSWTypedDict(CommonTypedDict, OSSOpenSearchTypedDict, HNSWFlavor1): ...
123
+
124
+
125
+ @cli.command()
126
+ @click_parameter_decorators_from_typed_dict(OSSOpenSearchHNSWTypedDict)
127
+ def OSSOpenSearch(**parameters: Unpack[OSSOpenSearchHNSWTypedDict]):
128
+ from .config import OSSOpenSearchConfig, OSSOpenSearchIndexConfig
129
+
130
+ run(
131
+ db=DB.OSSOpenSearch,
132
+ db_config=OSSOpenSearchConfig(
133
+ host=parameters["host"],
134
+ port=parameters["port"],
135
+ user=parameters["user"],
136
+ password=SecretStr(parameters["password"]),
137
+ ),
138
+ db_case_config=OSSOpenSearchIndexConfig(
139
+ number_of_shards=parameters["number_of_shards"],
140
+ number_of_replicas=parameters["number_of_replicas"],
141
+ index_thread_qty=parameters["index_thread_qty"],
142
+ number_of_segments=parameters["number_of_segments"],
143
+ refresh_interval=parameters["refresh_interval"],
144
+ force_merge_enabled=parameters["force_merge_enabled"],
145
+ flush_threshold_size=parameters["flush_threshold_size"],
146
+ index_thread_qty_during_force_merge=parameters["index_thread_qty_during_force_merge"],
147
+ cb_threshold=parameters["cb_threshold"],
148
+ efConstruction=parameters["ef_construction"],
149
+ efSearch=parameters["ef_runtime"],
150
+ M=parameters["m"],
151
+ engine=OSSOS_Engine(parameters["engine"]),
152
+ quantization_type=OSSOpenSearchQuantization(parameters["quantization_type"]),
153
+ ),
154
+ **parameters,
155
+ )
@@ -0,0 +1,157 @@
1
+ import logging
2
+ from enum import Enum
3
+
4
+ from pydantic import BaseModel, SecretStr, root_validator, validator
5
+
6
+ from ..api import DBCaseConfig, DBConfig, MetricType
7
+
8
+ log = logging.getLogger(__name__)
9
+
10
+
11
+ class OSSOpenSearchConfig(DBConfig, BaseModel):
12
+ host: str = ""
13
+ port: int = 80
14
+ user: str | None = None
15
+ password: SecretStr | None = None
16
+
17
+ def to_dict(self) -> dict:
18
+ use_ssl = self.port == 443
19
+ http_auth = (
20
+ (self.user, self.password.get_secret_value())
21
+ if self.user is not None and self.password is not None and len(self.user) != 0 and len(self.password) != 0
22
+ else ()
23
+ )
24
+ return {
25
+ "hosts": [{"host": self.host, "port": self.port}],
26
+ "http_auth": http_auth,
27
+ "use_ssl": use_ssl,
28
+ "http_compress": True,
29
+ "verify_certs": use_ssl,
30
+ "ssl_assert_hostname": False,
31
+ "ssl_show_warn": False,
32
+ "timeout": 600,
33
+ }
34
+
35
+ @validator("*")
36
+ def not_empty_field(cls, v: any, field: any):
37
+ if (
38
+ field.name in cls.common_short_configs()
39
+ or field.name in cls.common_long_configs()
40
+ or field.name in ["user", "password", "host"]
41
+ ):
42
+ return v
43
+ if isinstance(v, str | SecretStr) and len(v) == 0:
44
+ raise ValueError("Empty string!")
45
+ return v
46
+
47
+
48
+ class OSSOS_Engine(Enum):
49
+ faiss = "faiss"
50
+ lucene = "lucene"
51
+
52
+
53
+ class OSSOpenSearchQuantization(Enum):
54
+ fp32 = "fp32"
55
+ fp16 = "fp16"
56
+
57
+
58
+ class OSSOpenSearchIndexConfig(BaseModel, DBCaseConfig):
59
+ metric_type: MetricType = MetricType.L2
60
+ engine: OSSOS_Engine = OSSOS_Engine.faiss
61
+ efConstruction: int = 256
62
+ efSearch: int = 100
63
+ engine_name: str | None = None
64
+ metric_type_name: str | None = None
65
+ M: int = 16
66
+ index_thread_qty: int | None = 4
67
+ number_of_shards: int | None = 1
68
+ number_of_replicas: int | None = 0
69
+ number_of_segments: int | None = 1
70
+ refresh_interval: str | None = "60s"
71
+ force_merge_enabled: bool | None = True
72
+ flush_threshold_size: str | None = "5120mb"
73
+ index_thread_qty_during_force_merge: int = 8
74
+ cb_threshold: str | None = "50%"
75
+ number_of_indexing_clients: int | None = 1
76
+ use_routing: bool = False # for label-filter cases
77
+ oversample_factor: float = 1.0
78
+ quantization_type: OSSOpenSearchQuantization = OSSOpenSearchQuantization.fp32
79
+
80
+ @root_validator
81
+ def validate_engine_name(cls, values: dict):
82
+ """Map engine_name string from UI to engine enum"""
83
+ if values.get("engine_name"):
84
+ engine_name = values["engine_name"].lower()
85
+ if engine_name == "faiss":
86
+ values["engine"] = OSSOS_Engine.faiss
87
+ elif engine_name == "lucene":
88
+ values["engine"] = OSSOS_Engine.lucene
89
+ else:
90
+ log.warning(f"Unknown engine_name: {engine_name}, defaulting to faiss")
91
+ values["engine"] = OSSOS_Engine.faiss
92
+ return values
93
+
94
+ def __eq__(self, obj: any):
95
+ return (
96
+ self.engine == obj.engine
97
+ and self.M == obj.M
98
+ and self.efConstruction == obj.efConstruction
99
+ and self.number_of_shards == obj.number_of_shards
100
+ and self.number_of_replicas == obj.number_of_replicas
101
+ and self.number_of_segments == obj.number_of_segments
102
+ and self.use_routing == obj.use_routing
103
+ and self.quantization_type == obj.quantization_type
104
+ )
105
+
106
+ def __hash__(self) -> int:
107
+ return hash(
108
+ (
109
+ self.engine,
110
+ self.M,
111
+ self.efConstruction,
112
+ self.number_of_shards,
113
+ self.number_of_replicas,
114
+ self.number_of_segments,
115
+ self.use_routing,
116
+ self.quantization_type,
117
+ )
118
+ )
119
+
120
+ def parse_metric(self) -> str:
121
+ log.info(f"User specified metric_type: {self.metric_type_name}")
122
+ self.metric_type = MetricType[self.metric_type_name.upper()]
123
+ if self.metric_type == MetricType.IP:
124
+ return "innerproduct"
125
+ if self.metric_type == MetricType.COSINE:
126
+ return "cosinesimil"
127
+ if self.metric_type == MetricType.L2:
128
+ log.info("Using l2 as specified by user")
129
+ return "l2"
130
+ return "l2"
131
+
132
+ @property
133
+ def use_quant(self) -> bool:
134
+ return self.quantization_type is not OSSOpenSearchQuantization.fp32
135
+
136
+ def index_param(self) -> dict:
137
+ log.info(f"Using engine: {self.engine} for index creation")
138
+ log.info(f"Using metric_type: {self.metric_type_name} for index creation")
139
+ log.info(f"Resulting space_type: {self.parse_metric()} for index creation")
140
+
141
+ return {
142
+ "name": "hnsw",
143
+ "engine": self.engine.value,
144
+ "space_type": self.parse_metric(),
145
+ "parameters": {
146
+ "ef_construction": self.efConstruction,
147
+ "m": self.M,
148
+ **(
149
+ {"encoder": {"name": "sq", "parameters": {"type": self.quantization_type.value}}}
150
+ if self.use_quant
151
+ else {}
152
+ ),
153
+ },
154
+ }
155
+
156
+ def search_param(self) -> dict:
157
+ return {"ef_search": self.efSearch}