vectordb-bench 1.0.7__tar.gz → 1.0.9__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 (232) hide show
  1. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/PKG-INFO +10 -4
  2. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/README.md +9 -3
  3. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/hologres/config.py +1 -2
  4. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/hologres/hologres.py +20 -0
  5. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/milvus/config.py +0 -1
  6. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/pgvector/config.py +18 -10
  7. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/pgvector/pgvector.py +105 -78
  8. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/runner/serial_runner.py +1 -1
  9. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/cli/cli.py +25 -0
  10. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/interface.py +1 -1
  11. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/models.py +1 -0
  12. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench.egg-info/PKG-INFO +10 -4
  13. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/.devcontainer/Dockerfile +0 -0
  14. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/.devcontainer/devcontainer.json +0 -0
  15. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/.env.example +0 -0
  16. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/.github/workflows/publish_package_on_release.yml +0 -0
  17. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/.github/workflows/pull_request.yml +0 -0
  18. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/.gitignore +0 -0
  19. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/Dockerfile +0 -0
  20. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/LICENSE +0 -0
  21. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/Makefile +0 -0
  22. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/OWNERS +0 -0
  23. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/install/requirements_py3.11.txt +0 -0
  24. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/install.py +0 -0
  25. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/pyproject.toml +0 -0
  26. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/setup.cfg +0 -0
  27. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/tests/conftest.py +0 -0
  28. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/tests/pytest.ini +0 -0
  29. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/tests/test_bench_runner.py +0 -0
  30. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/tests/test_chroma.py +0 -0
  31. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/tests/test_data_source.py +0 -0
  32. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/tests/test_dataset.py +0 -0
  33. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/tests/test_elasticsearch_cloud.py +0 -0
  34. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/tests/test_models.py +0 -0
  35. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/tests/test_rate_runner.py +0 -0
  36. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/tests/test_redis.py +0 -0
  37. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/tests/test_utils.py +0 -0
  38. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/tests/ut_cases.py +0 -0
  39. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/__init__.py +0 -0
  40. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/__main__.py +0 -0
  41. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/__init__.py +0 -0
  42. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/assembler.py +0 -0
  43. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/cases.py +0 -0
  44. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/__init__.py +0 -0
  45. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/aliyun_elasticsearch/aliyun_elasticsearch.py +0 -0
  46. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/aliyun_elasticsearch/config.py +0 -0
  47. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/aliyun_opensearch/aliyun_opensearch.py +0 -0
  48. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/aliyun_opensearch/config.py +0 -0
  49. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/alloydb/alloydb.py +0 -0
  50. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/alloydb/cli.py +0 -0
  51. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/alloydb/config.py +0 -0
  52. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/api.py +0 -0
  53. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/aws_opensearch/aws_opensearch.py +0 -0
  54. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/aws_opensearch/cli.py +0 -0
  55. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/aws_opensearch/config.py +0 -0
  56. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/aws_opensearch/run.py +0 -0
  57. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/chroma/chroma.py +0 -0
  58. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/chroma/config.py +0 -0
  59. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/clickhouse/cli.py +0 -0
  60. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/clickhouse/clickhouse.py +0 -0
  61. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/clickhouse/config.py +0 -0
  62. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/elastic_cloud/config.py +0 -0
  63. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/elastic_cloud/elastic_cloud.py +0 -0
  64. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/hologres/cli.py +0 -0
  65. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/lancedb/cli.py +0 -0
  66. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/lancedb/config.py +0 -0
  67. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/lancedb/lancedb.py +0 -0
  68. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/mariadb/cli.py +0 -0
  69. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/mariadb/config.py +0 -0
  70. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/mariadb/mariadb.py +0 -0
  71. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/memorydb/cli.py +0 -0
  72. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/memorydb/config.py +0 -0
  73. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/memorydb/memorydb.py +0 -0
  74. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/milvus/cli.py +0 -0
  75. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/milvus/milvus.py +0 -0
  76. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/mongodb/config.py +0 -0
  77. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/mongodb/mongodb.py +0 -0
  78. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/oceanbase/cli.py +0 -0
  79. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/oceanbase/config.py +0 -0
  80. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/oceanbase/oceanbase.py +0 -0
  81. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/oss_opensearch/cli.py +0 -0
  82. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/oss_opensearch/config.py +0 -0
  83. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/oss_opensearch/oss_opensearch.py +0 -0
  84. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/oss_opensearch/run.py +0 -0
  85. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/pgdiskann/cli.py +0 -0
  86. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/pgdiskann/config.py +0 -0
  87. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/pgdiskann/pgdiskann.py +0 -0
  88. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/pgvecto_rs/cli.py +0 -0
  89. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/pgvecto_rs/config.py +0 -0
  90. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/pgvecto_rs/pgvecto_rs.py +0 -0
  91. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/pgvector/cli.py +0 -0
  92. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/pgvectorscale/cli.py +0 -0
  93. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/pgvectorscale/config.py +0 -0
  94. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/pgvectorscale/pgvectorscale.py +0 -0
  95. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/pinecone/config.py +0 -0
  96. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/pinecone/pinecone.py +0 -0
  97. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/qdrant_cloud/cli.py +0 -0
  98. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/qdrant_cloud/config.py +0 -0
  99. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/qdrant_cloud/qdrant_cloud.py +0 -0
  100. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/qdrant_local/cli.py +0 -0
  101. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/qdrant_local/config.py +0 -0
  102. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/qdrant_local/qdrant_local.py +0 -0
  103. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/redis/cli.py +0 -0
  104. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/redis/config.py +0 -0
  105. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/redis/redis.py +0 -0
  106. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/s3_vectors/config.py +0 -0
  107. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/s3_vectors/s3_vectors.py +0 -0
  108. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/test/cli.py +0 -0
  109. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/test/config.py +0 -0
  110. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/test/test.py +0 -0
  111. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/tidb/cli.py +0 -0
  112. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/tidb/config.py +0 -0
  113. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/tidb/tidb.py +0 -0
  114. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/vespa/cli.py +0 -0
  115. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/vespa/config.py +0 -0
  116. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/vespa/util.py +0 -0
  117. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/vespa/vespa.py +0 -0
  118. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/weaviate_cloud/cli.py +0 -0
  119. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/weaviate_cloud/config.py +0 -0
  120. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/weaviate_cloud/weaviate_cloud.py +0 -0
  121. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/zilliz_cloud/cli.py +0 -0
  122. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/zilliz_cloud/config.py +0 -0
  123. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/clients/zilliz_cloud/zilliz_cloud.py +0 -0
  124. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/data_source.py +0 -0
  125. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/dataset.py +0 -0
  126. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/filter.py +0 -0
  127. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/result_collector.py +0 -0
  128. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/runner/__init__.py +0 -0
  129. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/runner/mp_runner.py +0 -0
  130. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/runner/rate_runner.py +0 -0
  131. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/runner/read_write_runner.py +0 -0
  132. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/runner/util.py +0 -0
  133. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/task_runner.py +0 -0
  134. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/backend/utils.py +0 -0
  135. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/base.py +0 -0
  136. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/cli/__init__.py +0 -0
  137. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/cli/batch_cli.py +0 -0
  138. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/cli/vectordbbench.py +0 -0
  139. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/config-files/batch_sample_config.yml +0 -0
  140. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/config-files/sample_config.yml +0 -0
  141. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/custom/custom_case.json +0 -0
  142. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/fig/custom_case_run_test.png +0 -0
  143. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/fig/custom_dataset.png +0 -0
  144. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/fig/homepage/bar-chart.png +0 -0
  145. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/fig/homepage/concurrent.png +0 -0
  146. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/fig/homepage/custom.png +0 -0
  147. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/fig/homepage/label_filter.png +0 -0
  148. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/fig/homepage/qp$.png +0 -0
  149. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/fig/homepage/run_test.png +0 -0
  150. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/fig/homepage/streaming.png +0 -0
  151. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/fig/homepage/table.png +0 -0
  152. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/fig/run_test_select_case.png +0 -0
  153. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/fig/run_test_select_db.png +0 -0
  154. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/fig/run_test_submit.png +0 -0
  155. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/components/check_results/charts.py +0 -0
  156. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/components/check_results/data.py +0 -0
  157. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/components/check_results/expanderStyle.py +0 -0
  158. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/components/check_results/filters.py +0 -0
  159. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/components/check_results/footer.py +0 -0
  160. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/components/check_results/headerIcon.py +0 -0
  161. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/components/check_results/nav.py +0 -0
  162. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/components/check_results/priceTable.py +0 -0
  163. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/components/check_results/stPageConfig.py +0 -0
  164. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/components/concurrent/charts.py +0 -0
  165. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/components/custom/displayCustomCase.py +0 -0
  166. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/components/custom/displaypPrams.py +0 -0
  167. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/components/custom/getCustomConfig.py +0 -0
  168. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/components/custom/initStyle.py +0 -0
  169. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/components/get_results/saveAsImage.py +0 -0
  170. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/components/int_filter/charts.py +0 -0
  171. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/components/label_filter/charts.py +0 -0
  172. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/components/run_test/autoRefresh.py +0 -0
  173. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/components/run_test/caseSelector.py +0 -0
  174. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/components/run_test/dbConfigSetting.py +0 -0
  175. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/components/run_test/dbSelector.py +0 -0
  176. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/components/run_test/generateTasks.py +0 -0
  177. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/components/run_test/hideSidebar.py +0 -0
  178. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/components/run_test/initStyle.py +0 -0
  179. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/components/run_test/inputWidget.py +0 -0
  180. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/components/run_test/submitTask.py +0 -0
  181. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/components/streaming/charts.py +0 -0
  182. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/components/streaming/data.py +0 -0
  183. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/components/tables/data.py +0 -0
  184. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/components/welcome/explainPrams.py +0 -0
  185. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/components/welcome/pagestyle.py +0 -0
  186. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/components/welcome/welcomePrams.py +0 -0
  187. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/config/dbCaseConfigs.py +0 -0
  188. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/config/dbPrices.py +0 -0
  189. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/config/styles.py +0 -0
  190. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/pages/concurrent.py +0 -0
  191. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/pages/custom.py +0 -0
  192. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/pages/int_filter.py +0 -0
  193. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/pages/label_filter.py +0 -0
  194. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/pages/quries_per_dollar.py +0 -0
  195. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/pages/results.py +0 -0
  196. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/pages/run_test.py +0 -0
  197. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/pages/streaming.py +0 -0
  198. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/pages/tables.py +0 -0
  199. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/utils.py +0 -0
  200. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/frontend/vdbbench.py +0 -0
  201. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/log_util.py +0 -0
  202. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/metric.py +0 -0
  203. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/results/ElasticCloud/result_20230727_standard_elasticcloud.json +0 -0
  204. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/results/ElasticCloud/result_20230808_standard_elasticcloud.json +0 -0
  205. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/results/ElasticCloud/result_20250318_standard_elasticcloud.json +0 -0
  206. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/results/Milvus/result_20230727_standard_milvus.json +0 -0
  207. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/results/Milvus/result_20230808_standard_milvus.json +0 -0
  208. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/results/Milvus/result_20250509_standard_milvus.json +0 -0
  209. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/results/OpenSearch/result_20250224_standard_opensearch.json +0 -0
  210. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/results/PgVector/result_20230727_standard_pgvector.json +0 -0
  211. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/results/PgVector/result_20230808_standard_pgvector.json +0 -0
  212. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/results/Pinecone/result_20230727_standard_pinecone.json +0 -0
  213. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/results/Pinecone/result_20230808_standard_pinecone.json +0 -0
  214. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/results/Pinecone/result_20250124_standard_pinecone.json +0 -0
  215. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/results/QdrantCloud/result_20230727_standard_qdrantcloud.json +0 -0
  216. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/results/QdrantCloud/result_20230808_standard_qdrantcloud.json +0 -0
  217. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/results/QdrantCloud/result_20250602_standard_qdrantcloud.json +0 -0
  218. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/results/S3Vectors/result_20250722_standard_s3vectors.json +0 -0
  219. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/results/WeaviateCloud/result_20230727_standard_weaviatecloud.json +0 -0
  220. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/results/WeaviateCloud/result_20230808_standard_weaviatecloud.json +0 -0
  221. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/results/ZillizCloud/result_20250613_standard_zillizcloud.json +0 -0
  222. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/results/dbPrices.json +0 -0
  223. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/results/getLeaderboardData.py +0 -0
  224. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/results/getLeaderboardDataV2.py +0 -0
  225. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/results/leaderboard.json +0 -0
  226. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/results/leaderboard_v2.json +0 -0
  227. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench/results/leaderboard_v2_streaming.json +0 -0
  228. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench.egg-info/SOURCES.txt +0 -0
  229. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench.egg-info/dependency_links.txt +0 -0
  230. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench.egg-info/entry_points.txt +0 -0
  231. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/vectordb_bench.egg-info/requires.txt +0 -0
  232. {vectordb_bench-1.0.7 → vectordb_bench-1.0.9}/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.7
3
+ Version: 1.0.9
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
@@ -375,12 +375,18 @@ Options:
375
375
 
376
376
  ### Run Hologres from command line
377
377
 
378
+ It is recommended to use the following code for installation.
379
+ ```shell
380
+ pip install vectordb-bench[hologres] "psycopg[binary]" pgvector
381
+ ```
382
+
378
383
  Execute tests for the index types: HGraph.
379
384
 
380
385
  ```shell
381
- vectordbbench hologreshgraph --host xxx --port xxx --user ACCESS_ID --password ACCESS_KEY --database test \
382
- --m 64 --ef-construction 400 --case-type Performance768D1M \
383
- --index-type HGraph --ef-search 51 --k 10
386
+ NUM_PER_BATCH=10000 vectordbbench hologreshgraph --host Hologres_Endpoint --port 80 \
387
+ --user ACCESS_ID --password ACCESS_KEY --database DATABASE_NAME \
388
+ --m 64 --ef-construction 400 --case-type Performance768D10M \
389
+ --index-type HGraph --ef-search 400 --k 10 --num-concurrency 1,60,70,75,80,90,95,100,110,120
384
390
  ```
385
391
 
386
392
  To list the options for Hologres, execute `vectordbbench hologreshgraph --help`, The following are some Hologres-specific command-line options.
@@ -280,12 +280,18 @@ Options:
280
280
 
281
281
  ### Run Hologres from command line
282
282
 
283
+ It is recommended to use the following code for installation.
284
+ ```shell
285
+ pip install vectordb-bench[hologres] "psycopg[binary]" pgvector
286
+ ```
287
+
283
288
  Execute tests for the index types: HGraph.
284
289
 
285
290
  ```shell
286
- vectordbbench hologreshgraph --host xxx --port xxx --user ACCESS_ID --password ACCESS_KEY --database test \
287
- --m 64 --ef-construction 400 --case-type Performance768D1M \
288
- --index-type HGraph --ef-search 51 --k 10
291
+ NUM_PER_BATCH=10000 vectordbbench hologreshgraph --host Hologres_Endpoint --port 80 \
292
+ --user ACCESS_ID --password ACCESS_KEY --database DATABASE_NAME \
293
+ --m 64 --ef-construction 400 --case-type Performance768D10M \
294
+ --index-type HGraph --ef-search 400 --k 10 --num-concurrency 1,60,70,75,80,90,95,100,110,120
289
295
  ```
290
296
 
291
297
  To list the options for Hologres, execute `vectordbbench hologreshgraph --help`, The following are some Hologres-specific command-line options.
@@ -104,8 +104,6 @@ class HologresIndexConfig(BaseModel, DBCaseConfig):
104
104
  self.base_quantization_type = "fp32"
105
105
 
106
106
  return {
107
- "min_flush_proxima_row_count": self.min_flush_proxima_row_count,
108
- "min_compaction_proxima_row_count": self.min_compaction_proxima_row_count,
109
107
  "max_total_size_to_merge_mb": self.max_total_size_to_merge_mb,
110
108
  "build_thread_count": self.build_thread_count,
111
109
  "base_quantization_type": self.base_quantization_type,
@@ -113,6 +111,7 @@ class HologresIndexConfig(BaseModel, DBCaseConfig):
113
111
  "ef_construction": self.ef_construction,
114
112
  "precise_quantization_type": self.precise_quantization_type,
115
113
  "use_reorder": self.use_reorder,
114
+ "precise_io_type": "reader_io",
116
115
  }
117
116
 
118
117
  def searcher_params(self) -> dict:
@@ -128,6 +128,18 @@ class Hologres(VectorDB):
128
128
  )
129
129
  self.conn.commit()
130
130
 
131
+ try:
132
+ log.info(f"{self.name} client purge table recycle bin: {self.table_name}")
133
+ self.cursor.execute(
134
+ sql.SQL("purge TABLE {table_name};").format(
135
+ table_name=sql.Identifier(self.table_name),
136
+ ),
137
+ )
138
+ except Exception as e:
139
+ log.info(f"{self.name} client purge table {self.table_name} recycle bin failed, error: {e}, ignore.")
140
+ finally:
141
+ self.conn.commit()
142
+
131
143
  try:
132
144
  log.info(f"{self.name} client drop table group : {self._tg_name}")
133
145
  self.cursor.execute(sql.SQL(f"CALL HG_DROP_TABLE_GROUP('{self._tg_name}');"))
@@ -136,6 +148,14 @@ class Hologres(VectorDB):
136
148
  finally:
137
149
  self.conn.commit()
138
150
 
151
+ try:
152
+ log.info(f"{self.name} client free cache")
153
+ self.cursor.execute("select hg_admin_command('freecache');")
154
+ except Exception as e:
155
+ log.info(f"{self.name} client free cache failed, error: {e}, ignore.")
156
+ finally:
157
+ self.conn.commit()
158
+
139
159
  def optimize(self, data_size: int | None = None):
140
160
  if self.case_config.create_index_after_load:
141
161
  self._create_index()
@@ -320,7 +320,6 @@ class GPUIVFFlatConfig(MilvusIndexConfig, DBCaseConfig):
320
320
 
321
321
  class GPUBruteForceConfig(MilvusIndexConfig, DBCaseConfig):
322
322
  limit: int = 10 # Default top-k for search
323
- metric_type: str # Metric type (e.g., 'L2', 'IP', etc.)
324
323
  index: IndexType = IndexType.GPU_BRUTE_FORCE # Index type set to GPU_BRUTE_FORCE
325
324
 
326
325
  def index_param(self) -> dict:
@@ -21,21 +21,25 @@ class PgVectorConfigDict(TypedDict):
21
21
 
22
22
 
23
23
  class PgVectorConfig(DBConfig):
24
- user_name: SecretStr = SecretStr("postgres")
24
+ user_name: SecretStr = "postgres"
25
25
  password: SecretStr
26
26
  host: str = "localhost"
27
27
  port: int = 5432
28
- db_name: str
28
+ db_name: str = "vectordb"
29
+ table_name: str = "vdbbench_table_test"
29
30
 
30
31
  def to_dict(self) -> PgVectorConfigDict:
31
- user_str = self.user_name.get_secret_value()
32
+ user_str = self.user_name.get_secret_value() if isinstance(self.user_name, SecretStr) else self.user_name
32
33
  pwd_str = self.password.get_secret_value()
33
34
  return {
34
- "host": self.host,
35
- "port": self.port,
36
- "dbname": self.db_name,
37
- "user": user_str,
38
- "password": pwd_str,
35
+ "connect_config": {
36
+ "host": self.host,
37
+ "port": self.port,
38
+ "dbname": self.db_name,
39
+ "user": user_str,
40
+ "password": pwd_str,
41
+ },
42
+ "table_name": self.table_name,
39
43
  }
40
44
 
41
45
 
@@ -59,6 +63,10 @@ class PgVectorIndexConfig(BaseModel, DBCaseConfig):
59
63
  metric_type: MetricType | None = None
60
64
  create_index_before_load: bool = False
61
65
  create_index_after_load: bool = True
66
+ # Scan more of the index to get enough results for filter-cases.
67
+ # Options: "strict_order" (order by distance), "relaxed_order" (slightly out of order but better recall)
68
+ # See: https://github.com/pgvector/pgvector?tab=readme-ov-file#iterative-index-scans
69
+ iterative_scan: str = "relaxed_order"
62
70
 
63
71
  def parse_metric(self) -> str:
64
72
  d = {
@@ -205,7 +213,7 @@ class PgVectorIVFFlatConfig(PgVectorIndexConfig):
205
213
  }
206
214
 
207
215
  def session_param(self) -> PgVectorSessionCommands:
208
- session_parameters = {"ivfflat.probes": self.probes}
216
+ session_parameters = {"ivfflat.probes": self.probes, "ivfflat.iterative_scan": self.iterative_scan}
209
217
  return {"session_options": self._optionally_build_set_options(session_parameters)}
210
218
 
211
219
 
@@ -255,7 +263,7 @@ class PgVectorHNSWConfig(PgVectorIndexConfig):
255
263
  }
256
264
 
257
265
  def session_param(self) -> PgVectorSessionCommands:
258
- session_parameters = {"hnsw.ef_search": self.ef_search}
266
+ session_parameters = {"hnsw.ef_search": self.ef_search, "hnsw.iterative_scan": self.iterative_scan}
259
267
  return {"session_options": self._optionally_build_set_options(session_parameters)}
260
268
 
261
269
 
@@ -10,6 +10,8 @@ import psycopg
10
10
  from pgvector.psycopg import register_vector
11
11
  from psycopg import Connection, Cursor, sql
12
12
 
13
+ from vectordb_bench.backend.filter import Filter, FilterOp
14
+
13
15
  from ..api import VectorDB
14
16
  from .config import PgVectorConfigDict, PgVectorIndexConfig
15
17
 
@@ -19,39 +21,46 @@ log = logging.getLogger(__name__)
19
21
  class PgVector(VectorDB):
20
22
  """Use psycopg instructions"""
21
23
 
24
+ supported_filter_types: list[FilterOp] = [
25
+ FilterOp.NonFilter,
26
+ FilterOp.NumGE,
27
+ FilterOp.StrEqual,
28
+ ]
29
+
22
30
  conn: psycopg.Connection[Any] | None = None
23
31
  cursor: psycopg.Cursor[Any] | None = None
24
32
 
25
- _filtered_search: sql.Composed
26
- _unfiltered_search: sql.Composed
33
+ _search: sql.Composed
27
34
 
28
35
  def __init__(
29
36
  self,
30
37
  dim: int,
31
38
  db_config: PgVectorConfigDict,
32
39
  db_case_config: PgVectorIndexConfig,
33
- collection_name: str = "pg_vector_collection",
34
40
  drop_old: bool = False,
41
+ with_scalar_labels: bool = False,
35
42
  **kwargs,
36
43
  ):
37
44
  self.name = "PgVector"
38
- self.db_config = db_config
39
45
  self.case_config = db_case_config
40
- self.table_name = collection_name
46
+ self.table_name = db_config["table_name"]
47
+ self.connect_config = db_config["connect_config"]
41
48
  self.dim = dim
49
+ self.with_scalar_labels = with_scalar_labels
42
50
 
43
51
  self._index_name = "pgvector_index"
44
52
  self._primary_field = "id"
45
53
  self._vector_field = "embedding"
54
+ self._scalar_label_field = "label"
46
55
 
47
56
  # construct basic units
48
- self.conn, self.cursor = self._create_connection(**self.db_config)
57
+ self.conn, self.cursor = self._create_connection(**self.connect_config)
49
58
 
50
59
  # create vector extension
51
60
  self.cursor.execute("CREATE EXTENSION IF NOT EXISTS vector")
52
61
  self.conn.commit()
53
62
 
54
- log.info(f"{self.name} config values: {self.db_config}\n{self.case_config}")
63
+ log.info(f"{self.name} config values: {self.connect_config}\n{self.case_config}")
55
64
  if not any(
56
65
  (
57
66
  self.case_config.create_index_before_load,
@@ -60,7 +69,7 @@ class PgVector(VectorDB):
60
69
  ):
61
70
  msg = (
62
71
  f"{self.name} config must create an index using create_index_before_load or create_index_after_load"
63
- f"{self.name} config values: {self.db_config}\n{self.case_config}"
72
+ f"{self.name} config values: {self.connect_config}\n{self.case_config}"
64
73
  )
65
74
  log.error(msg)
66
75
  raise RuntimeError(msg)
@@ -89,13 +98,13 @@ class PgVector(VectorDB):
89
98
 
90
99
  return conn, cursor
91
100
 
92
- def _generate_search_query(self, filtered: bool = False) -> sql.Composed:
101
+ def _generate_search_query(self) -> sql.Composed:
93
102
  index_param = self.case_config.index_param()
94
103
  reranking = self.case_config.search_param()["reranking"]
95
104
  column_name = (
96
- sql.SQL("binary_quantize({0})").format(sql.Identifier("embedding"))
105
+ sql.SQL("binary_quantize({0})").format(sql.Identifier(self._vector_field))
97
106
  if index_param["quantization_type"] == "bit" and index_param["table_quantization_type"] != "bit"
98
- else sql.SQL("embedding")
107
+ else sql.SQL(self._vector_field)
99
108
  )
100
109
  search_vector = (
101
110
  sql.SQL("binary_quantize({0})").format(sql.Placeholder())
@@ -114,12 +123,14 @@ class PgVector(VectorDB):
114
123
  """
115
124
  SELECT i.id
116
125
  FROM (
117
- SELECT id, embedding {reranking_metric_fun_op} %s::{table_quantization_type} AS distance
126
+ SELECT {primary_field}, {vector_field} {reranking_metric_fun_op} %s::{table_quantization_type} AS distance
118
127
  FROM public.{table_name} {where_clause}
119
128
  ORDER BY {column_name}::{quantization_type}({dim})
120
- """,
129
+ """, # noqa: E501
121
130
  ).format(
122
131
  table_name=sql.Identifier(self.table_name),
132
+ primary_field=sql.Identifier(self._primary_field),
133
+ vector_field=sql.Identifier(self._vector_field),
123
134
  column_name=column_name,
124
135
  reranking_metric_fun_op=sql.SQL(
125
136
  self.case_config.search_param()["reranking_metric_fun_op"],
@@ -128,7 +139,7 @@ class PgVector(VectorDB):
128
139
  table_quantization_type=sql.SQL(index_param["table_quantization_type"]),
129
140
  quantization_type=sql.SQL(index_param["quantization_type"]),
130
141
  dim=sql.Literal(self.dim),
131
- where_clause=sql.SQL("WHERE id >= %s") if filtered else sql.SQL(""),
142
+ where_clause=sql.SQL(self.where_clause),
132
143
  ),
133
144
  sql.SQL(self.case_config.search_param()["metric_fun_op"]),
134
145
  sql.SQL(
@@ -154,15 +165,16 @@ class PgVector(VectorDB):
154
165
  [
155
166
  sql.SQL(
156
167
  """
157
- SELECT id FROM public.{table_name}
168
+ SELECT {primary_field} FROM public.{table_name}
158
169
  {where_clause} ORDER BY {column_name}::{quantization_type}({dim})
159
170
  """,
160
171
  ).format(
161
172
  table_name=sql.Identifier(self.table_name),
173
+ primary_field=sql.Identifier(self._primary_field),
162
174
  column_name=column_name,
163
175
  quantization_type=sql.SQL(index_param["quantization_type"]),
164
176
  dim=sql.Literal(self.dim),
165
- where_clause=sql.SQL("WHERE id >= %s") if filtered else sql.SQL(""),
177
+ where_clause=sql.SQL(self.where_clause),
166
178
  ),
167
179
  sql.SQL(self.case_config.search_param()["metric_fun_op"]),
168
180
  sql.SQL(" {search_vector}::{quantization_type}({dim}) LIMIT %s::int").format(
@@ -176,10 +188,12 @@ class PgVector(VectorDB):
176
188
  search_query = sql.Composed(
177
189
  [
178
190
  sql.SQL(
179
- "SELECT id FROM public.{table_name} {where_clause} ORDER BY embedding ",
191
+ "SELECT {primary_field} FROM public.{table_name} {where_clause} ORDER BY {vector_field}",
180
192
  ).format(
181
193
  table_name=sql.Identifier(self.table_name),
182
- where_clause=sql.SQL("WHERE id >= %s") if filtered else sql.SQL(""),
194
+ primary_field=sql.Identifier(self._primary_field),
195
+ vector_field=sql.Identifier(self._vector_field),
196
+ where_clause=sql.SQL(self.where_clause),
183
197
  ),
184
198
  sql.SQL(self.case_config.search_param()["metric_fun_op"]),
185
199
  sql.SQL(" {search_vector}::{quantization_type}({dim}) LIMIT %s::int").format(
@@ -201,7 +215,7 @@ class PgVector(VectorDB):
201
215
  >>> self.search_embedding()
202
216
  """
203
217
 
204
- self.conn, self.cursor = self._create_connection(**self.db_config)
218
+ self.conn, self.cursor = self._create_connection(**self.connect_config)
205
219
 
206
220
  # index configuration may have commands defined that we should set during each client session
207
221
  session_options: Sequence[dict[str, Any]] = self.case_config.session_param()["session_options"]
@@ -216,9 +230,6 @@ class PgVector(VectorDB):
216
230
  self.cursor.execute(command)
217
231
  self.conn.commit()
218
232
 
219
- self._filtered_search = self._generate_search_query(filtered=True)
220
- self._unfiltered_search = self._generate_search_query()
221
-
222
233
  try:
223
234
  yield
224
235
  finally:
@@ -274,7 +285,7 @@ class PgVector(VectorDB):
274
285
  )
275
286
  self.cursor.execute(
276
287
  sql.SQL("ALTER USER {} SET maintenance_work_mem TO {};").format(
277
- sql.Identifier(self.db_config["user"]),
288
+ sql.Identifier(self.connect_config["user"]),
278
289
  index_param["maintenance_work_mem"],
279
290
  ),
280
291
  )
@@ -288,7 +299,7 @@ class PgVector(VectorDB):
288
299
  )
289
300
  self.cursor.execute(
290
301
  sql.SQL("ALTER USER {} SET max_parallel_maintenance_workers TO '{}';").format(
291
- sql.Identifier(self.db_config["user"]),
302
+ sql.Identifier(self.connect_config["user"]),
292
303
  index_param["max_parallel_workers"],
293
304
  ),
294
305
  )
@@ -299,7 +310,7 @@ class PgVector(VectorDB):
299
310
  )
300
311
  self.cursor.execute(
301
312
  sql.SQL("ALTER USER {} SET max_parallel_workers TO '{}';").format(
302
- sql.Identifier(self.db_config["user"]),
313
+ sql.Identifier(self.connect_config["user"]),
303
314
  index_param["max_parallel_workers"],
304
315
  ),
305
316
  )
@@ -382,18 +393,36 @@ class PgVector(VectorDB):
382
393
  log.info(f"{self.name} client create table : {self.table_name}")
383
394
 
384
395
  # create table
385
- self.cursor.execute(
386
- sql.SQL(
387
- """
388
- CREATE TABLE IF NOT EXISTS public.{table_name}
389
- (id BIGINT PRIMARY KEY, embedding {table_quantization_type}({dim}));
390
- """
391
- ).format(
392
- table_name=sql.Identifier(self.table_name),
393
- table_quantization_type=sql.SQL(index_param["table_quantization_type"]),
394
- dim=dim,
396
+ if self.with_scalar_labels:
397
+ self.cursor.execute(
398
+ sql.SQL(
399
+ """
400
+ CREATE TABLE IF NOT EXISTS public.{table_name}
401
+ ({primary_field} BIGINT PRIMARY KEY, embedding {table_quantization_type}({dim}), {label_field} VARCHAR(64));
402
+ """, # noqa: E501
403
+ ).format(
404
+ table_name=sql.Identifier(self.table_name),
405
+ table_quantization_type=sql.SQL(index_param["table_quantization_type"]),
406
+ dim=dim,
407
+ primary_field=sql.Identifier(self._primary_field),
408
+ label_field=sql.Identifier(self._scalar_label_field),
409
+ )
395
410
  )
396
- )
411
+ else:
412
+ self.cursor.execute(
413
+ sql.SQL(
414
+ """
415
+ CREATE TABLE IF NOT EXISTS public.{table_name}
416
+ ({primary_field} BIGINT PRIMARY KEY, embedding {table_quantization_type}({dim}));
417
+ """
418
+ ).format(
419
+ table_name=sql.Identifier(self.table_name),
420
+ table_quantization_type=sql.SQL(index_param["table_quantization_type"]),
421
+ dim=dim,
422
+ primary_field=sql.Identifier(self._primary_field),
423
+ )
424
+ )
425
+
397
426
  self.cursor.execute(
398
427
  sql.SQL(
399
428
  "ALTER TABLE public.{table_name} ALTER COLUMN embedding SET STORAGE PLAIN;",
@@ -404,14 +433,17 @@ class PgVector(VectorDB):
404
433
  log.warning(f"Failed to create pgvector table: {self.table_name} error: {e}")
405
434
  raise e from None
406
435
 
407
- def insert_embeddings(
436
+ def insert_embeddings( # noqa: PLR0912
408
437
  self,
409
438
  embeddings: list[list[float]],
410
439
  metadata: list[int],
440
+ labels_data: list[str] | None = None,
411
441
  **kwargs: Any,
412
442
  ) -> tuple[int, Exception | None]:
413
443
  assert self.conn is not None, "Connection is not initialized"
414
444
  assert self.cursor is not None, "Cursor is not initialized"
445
+ if self.with_scalar_labels:
446
+ assert labels_data is not None, "labels_data should be provided if with_scalar_labels is set to True"
415
447
 
416
448
  index_param = self.case_config.index_param()
417
449
 
@@ -433,7 +465,10 @@ class PgVector(VectorDB):
433
465
  embeddings_bit += "1"
434
466
  else:
435
467
  embeddings_bit += "0"
436
- copy.write_row((str(row), embeddings_bit))
468
+ if self.with_scalar_labels:
469
+ copy.write_row((str(row), embeddings_bit, labels_data[i]))
470
+ else:
471
+ copy.write_row((str(row), embeddings_bit))
437
472
  else:
438
473
  with self.cursor.copy(
439
474
  sql.SQL("COPY public.{table_name} FROM STDIN (FORMAT BINARY)").format(
@@ -441,29 +476,47 @@ class PgVector(VectorDB):
441
476
  )
442
477
  ) as copy:
443
478
  if index_param["table_quantization_type"] == "halfvec":
444
- copy.set_types(["bigint", "halfvec"])
445
479
  for i, row in enumerate(metadata_arr):
446
- copy.write_row((row, np.float16(embeddings_arr[i])))
480
+ if self.with_scalar_labels:
481
+ copy.set_types(["bigint", "halfvec", "varchar"])
482
+ copy.write_row((row, np.float16(embeddings_arr[i]), labels_data[i]))
483
+ else:
484
+ copy.set_types(["bigint", "halfvec"])
485
+ copy.write_row((row, np.float16(embeddings_arr[i])))
447
486
  else:
448
- copy.set_types(["bigint", "vector"])
449
487
  for i, row in enumerate(metadata_arr):
450
- copy.write_row((row, embeddings_arr[i]))
488
+ if self.with_scalar_labels:
489
+ copy.set_types(["bigint", "vector", "varchar"])
490
+ copy.write_row((row, embeddings_arr[i], labels_data[i]))
491
+ else:
492
+ copy.set_types(["bigint", "vector"])
493
+ copy.write_row((row, embeddings_arr[i]))
451
494
  self.conn.commit()
452
495
 
453
- if kwargs.get("last_batch"):
454
- self._post_insert()
455
-
456
496
  return len(metadata), None
457
497
  except Exception as e:
458
498
  log.warning(f"Failed to insert data into pgvector table ({self.table_name}), error: {e}")
459
499
  return 0, e
460
500
 
501
+ def prepare_filter(self, filters: Filter):
502
+ if filters.type == FilterOp.NonFilter:
503
+ self.where_clause = ""
504
+ elif filters.type == FilterOp.NumGE:
505
+ self.where_clause = f"WHERE {self._primary_field} >= {filters.int_value}"
506
+ elif filters.type == FilterOp.StrEqual:
507
+ self.where_clause = f"WHERE {self._scalar_label_field} = '{filters.label_value}'"
508
+ else:
509
+ msg = f"Not support Filter for PgVector - {filters}"
510
+ raise ValueError(msg)
511
+
512
+ self._search = self._generate_search_query()
513
+
461
514
  def search_embedding(
462
515
  self,
463
516
  query: list[float],
464
517
  k: int = 100,
465
- filters: dict | None = None,
466
518
  timeout: int | None = None,
519
+ **kwargs: Any,
467
520
  ) -> list[int]:
468
521
  assert self.conn is not None, "Connection is not initialized"
469
522
  assert self.cursor is not None, "Cursor is not initialized"
@@ -471,36 +524,10 @@ class PgVector(VectorDB):
471
524
  index_param = self.case_config.index_param()
472
525
  search_param = self.case_config.search_param()
473
526
  q = np.asarray(query)
474
- if filters:
475
- gt = filters.get("id")
476
- if index_param["quantization_type"] == "bit" and search_param["reranking"]:
477
- result = self.cursor.execute(
478
- self._filtered_search,
479
- (q, gt, q, k),
480
- prepare=True,
481
- binary=True,
482
- )
483
- else:
484
- result = self.cursor.execute(
485
- self._filtered_search,
486
- (gt, q, k),
487
- prepare=True,
488
- binary=True,
489
- )
490
-
491
- elif index_param["quantization_type"] == "bit" and search_param["reranking"]:
492
- result = self.cursor.execute(
493
- self._unfiltered_search,
494
- (q, q, k),
495
- prepare=True,
496
- binary=True,
497
- )
498
- else:
499
- result = self.cursor.execute(
500
- self._unfiltered_search,
501
- (q, k),
502
- prepare=True,
503
- binary=True,
504
- )
505
-
527
+ result = self.cursor.execute(
528
+ self._search,
529
+ (q, q, k) if index_param["quantization_type"] == "bit" and search_param["reranking"] else (q, k),
530
+ prepare=True,
531
+ binary=True,
532
+ )
506
533
  return [int(i[0]) for i in result.fetchall()]
@@ -205,7 +205,7 @@ class SerialInsertRunner:
205
205
  raise LoadTimeoutError(self.timeout)
206
206
 
207
207
  def run(self) -> int:
208
- count, dur = self._insert_all_batches()
208
+ count, _ = self._insert_all_batches()
209
209
  return count
210
210
 
211
211
 
@@ -183,6 +183,11 @@ def get_custom_case_config(parameters: dict) -> dict:
183
183
  "with_gt": parameters["custom_dataset_with_gt"],
184
184
  },
185
185
  }
186
+ elif parameters["case_type"] == "NewIntFilterPerformanceCase":
187
+ custom_case_config = {
188
+ "dataset_with_size_type": parameters["dataset_with_size_type"],
189
+ "filter_rate": parameters["filter_rate"],
190
+ }
186
191
  return custom_case_config
187
192
 
188
193
 
@@ -416,6 +421,26 @@ class CommonTypedDict(TypedDict):
416
421
  ),
417
422
  ]
418
423
  task_label: Annotated[str, click.option("--task-label", help="Task label")]
424
+ dataset_with_size_type: Annotated[
425
+ str,
426
+ click.option(
427
+ "--dataset-with-size-type",
428
+ help="Dataset with size type for NewIntFilterPerformanceCase, you can use Medium Cohere (768dim, 1M)|"
429
+ "Large Cohere (768dim, 10M)|Medium Bioasq (1024dim, 1M)|Large Bioasq (1024dim, 10M)|"
430
+ "Large OpenAI (1536dim, 5M)|Medium OpenAI (1536dim, 500K)",
431
+ default="Medium Cohere (768dim, 1M)",
432
+ show_default=True,
433
+ ),
434
+ ]
435
+ filter_rate: Annotated[
436
+ float,
437
+ click.option(
438
+ "--filter-rate",
439
+ help="Filter rate for NewIntFilterPerformanceCase",
440
+ default=0.01,
441
+ show_default=True,
442
+ ),
443
+ ]
419
444
 
420
445
 
421
446
  class HNSWBaseTypedDict(TypedDict):
@@ -279,7 +279,7 @@ class BenchMarkRunner:
279
279
  p.send_signal(sig)
280
280
  except psutil.NoSuchProcess:
281
281
  pass
282
- gone, alive = psutil.wait_procs(children, timeout=timeout, callback=on_terminate)
282
+ _, alive = psutil.wait_procs(children, timeout=timeout, callback=on_terminate)
283
283
 
284
284
  for p in alive:
285
285
  log.warning(f"force killing child process: {p}")
@@ -127,6 +127,7 @@ class CaseConfigParamType(Enum):
127
127
  use_routing = "use_routing"
128
128
 
129
129
  dataset_with_size_type = "dataset_with_size_type"
130
+ filter_rate = "filter_rate"
130
131
  insert_rate = "insert_rate"
131
132
  search_stages = "search_stages"
132
133
  concurrencies = "concurrencies"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vectordb-bench
3
- Version: 1.0.7
3
+ Version: 1.0.9
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
@@ -375,12 +375,18 @@ Options:
375
375
 
376
376
  ### Run Hologres from command line
377
377
 
378
+ It is recommended to use the following code for installation.
379
+ ```shell
380
+ pip install vectordb-bench[hologres] "psycopg[binary]" pgvector
381
+ ```
382
+
378
383
  Execute tests for the index types: HGraph.
379
384
 
380
385
  ```shell
381
- vectordbbench hologreshgraph --host xxx --port xxx --user ACCESS_ID --password ACCESS_KEY --database test \
382
- --m 64 --ef-construction 400 --case-type Performance768D1M \
383
- --index-type HGraph --ef-search 51 --k 10
386
+ NUM_PER_BATCH=10000 vectordbbench hologreshgraph --host Hologres_Endpoint --port 80 \
387
+ --user ACCESS_ID --password ACCESS_KEY --database DATABASE_NAME \
388
+ --m 64 --ef-construction 400 --case-type Performance768D10M \
389
+ --index-type HGraph --ef-search 400 --k 10 --num-concurrency 1,60,70,75,80,90,95,100,110,120
384
390
  ```
385
391
 
386
392
  To list the options for Hologres, execute `vectordbbench hologreshgraph --help`, The following are some Hologres-specific command-line options.