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