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