vectordb-bench 0.0.13__tar.gz → 0.0.14__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/PKG-INFO +28 -3
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/README.md +25 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/pyproject.toml +2 -2
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/aws_opensearch/aws_opensearch.py +47 -6
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/aws_opensearch/config.py +12 -6
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/aws_opensearch/run.py +34 -3
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/pgvector/cli.py +17 -2
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/pgvector/config.py +20 -5
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/pgvector/pgvector.py +95 -25
- vectordb_bench-0.0.14/vectordb_bench/backend/clients/pgvectorscale/cli.py +108 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/pgvectorscale/pgvectorscale.py +22 -4
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/pinecone/config.py +0 -2
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/pinecone/pinecone.py +34 -36
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/redis/cli.py +8 -0
- vectordb_bench-0.0.14/vectordb_bench/backend/clients/redis/config.py +45 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/runner/mp_runner.py +2 -1
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/cli/cli.py +137 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/cli/vectordbbench.py +2 -1
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/check_results/charts.py +9 -6
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/concurrent/charts.py +3 -6
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/frontend/config/dbCaseConfigs.py +57 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/frontend/pages/quries_per_dollar.py +13 -5
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/frontend/vdb_benchmark.py +11 -3
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/models.py +7 -3
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/results/Milvus/result_20230727_standard_milvus.json +53 -1
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/results/Milvus/result_20230808_standard_milvus.json +48 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/results/ZillizCloud/result_20230727_standard_zillizcloud.json +29 -1
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/results/ZillizCloud/result_20230808_standard_zillizcloud.json +24 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/results/ZillizCloud/result_20240105_standard_202401_zillizcloud.json +98 -49
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/results/getLeaderboardData.py +17 -7
- vectordb_bench-0.0.14/vectordb_bench/results/leaderboard.json +1 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench.egg-info/PKG-INFO +28 -3
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench.egg-info/SOURCES.txt +1 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench.egg-info/requires.txt +2 -2
- vectordb_bench-0.0.13/vectordb_bench/backend/clients/redis/config.py +0 -14
- vectordb_bench-0.0.13/vectordb_bench/results/leaderboard.json +0 -1
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/.devcontainer/Dockerfile +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/.devcontainer/devcontainer.json +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/.env.example +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/.github/workflows/publish_package_on_release.yml +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/.github/workflows/pull_request.yml +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/.gitignore +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/.ruff.toml +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/Dockerfile +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/LICENSE +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/Makefile +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/OWNERS +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/fig/custom_case_run_test.png +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/fig/custom_dataset.png +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/install/requirements_py3.11.txt +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/install.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/setup.cfg +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/tests/conftest.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/tests/pytest.ini +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/tests/test_bench_runner.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/tests/test_chroma.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/tests/test_data_source.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/tests/test_dataset.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/tests/test_elasticsearch_cloud.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/tests/test_models.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/tests/test_redis.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/tests/test_utils.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/tests/ut_cases.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/__init__.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/__main__.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/__init__.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/assembler.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/cases.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/__init__.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/api.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/aws_opensearch/cli.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/chroma/chroma.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/chroma/config.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/elastic_cloud/config.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/elastic_cloud/elastic_cloud.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/memorydb/cli.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/memorydb/config.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/memorydb/memorydb.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/milvus/cli.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/milvus/config.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/milvus/milvus.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/pgvecto_rs/cli.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/pgvecto_rs/config.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/pgvecto_rs/pgvecto_rs.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/pgvectorscale/config.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/qdrant_cloud/config.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/qdrant_cloud/qdrant_cloud.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/redis/redis.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/test/cli.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/test/config.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/test/test.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/weaviate_cloud/cli.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/weaviate_cloud/config.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/weaviate_cloud/weaviate_cloud.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/zilliz_cloud/cli.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/zilliz_cloud/config.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/zilliz_cloud/zilliz_cloud.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/data_source.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/dataset.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/result_collector.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/runner/__init__.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/runner/serial_runner.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/task_runner.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/utils.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/base.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/cli/__init__.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/config-files/sample_config.yml +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/custom/custom_case.json +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/check_results/data.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/check_results/expanderStyle.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/check_results/filters.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/check_results/footer.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/check_results/headerIcon.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/check_results/nav.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/check_results/priceTable.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/check_results/stPageConfig.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/custom/displayCustomCase.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/custom/displaypPrams.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/custom/getCustomConfig.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/custom/initStyle.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/get_results/saveAsImage.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/run_test/autoRefresh.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/run_test/caseSelector.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/run_test/dbConfigSetting.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/run_test/dbSelector.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/run_test/generateTasks.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/run_test/hideSidebar.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/run_test/initStyle.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/run_test/submitTask.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/frontend/components/tables/data.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/frontend/config/dbPrices.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/frontend/config/styles.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/frontend/pages/concurrent.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/frontend/pages/custom.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/frontend/pages/run_test.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/frontend/pages/tables.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/frontend/utils.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/interface.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/log_util.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/metric.py +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/results/ElasticCloud/result_20230727_standard_elasticcloud.json +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/results/ElasticCloud/result_20230808_standard_elasticcloud.json +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/results/PgVector/result_20230727_standard_pgvector.json +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/results/PgVector/result_20230808_standard_pgvector.json +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/results/Pinecone/result_20230727_standard_pinecone.json +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/results/Pinecone/result_20230808_standard_pinecone.json +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/results/QdrantCloud/result_20230727_standard_qdrantcloud.json +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/results/QdrantCloud/result_20230808_standard_qdrantcloud.json +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/results/WeaviateCloud/result_20230727_standard_weaviatecloud.json +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/results/WeaviateCloud/result_20230808_standard_weaviatecloud.json +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/results/dbPrices.json +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench.egg-info/dependency_links.txt +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench.egg-info/entry_points.txt +0 -0
- {vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: vectordb-bench
|
3
|
-
Version: 0.0.
|
3
|
+
Version: 0.0.14
|
4
4
|
Summary: VectorDBBench is not just an offering of benchmark results for mainstream vector databases and cloud services, it's your go-to tool for the ultimate performance and cost-effectiveness comparison. Designed with ease-of-use in mind, VectorDBBench is devised to help users, even non-professionals, reproduce results or test new systems, making the hunt for the optimal choice amongst a plethora of cloud services and open-source vector databases a breeze.
|
5
5
|
Author-email: XuanYang-cn <xuan.yang@zilliz.com>
|
6
6
|
Project-URL: repository, https://github.com/zilliztech/VectorDBBench
|
@@ -36,7 +36,7 @@ Requires-Dist: pinecone-client; extra == "all"
|
|
36
36
|
Requires-Dist: weaviate-client; extra == "all"
|
37
37
|
Requires-Dist: elasticsearch; extra == "all"
|
38
38
|
Requires-Dist: pgvector; extra == "all"
|
39
|
-
Requires-Dist: pgvecto_rs[psycopg3]>=0.2.
|
39
|
+
Requires-Dist: pgvecto_rs[psycopg3]>=0.2.2; extra == "all"
|
40
40
|
Requires-Dist: sqlalchemy; extra == "all"
|
41
41
|
Requires-Dist: redis; extra == "all"
|
42
42
|
Requires-Dist: chromadb; extra == "all"
|
@@ -61,7 +61,7 @@ Requires-Dist: psycopg; extra == "pgvectorscale"
|
|
61
61
|
Requires-Dist: psycopg-binary; extra == "pgvectorscale"
|
62
62
|
Requires-Dist: pgvector; extra == "pgvectorscale"
|
63
63
|
Provides-Extra: pgvecto-rs
|
64
|
-
Requires-Dist: pgvecto_rs[psycopg3]>=0.2.
|
64
|
+
Requires-Dist: pgvecto_rs[psycopg3]>=0.2.2; extra == "pgvecto-rs"
|
65
65
|
Provides-Extra: redis
|
66
66
|
Requires-Dist: redis; extra == "redis"
|
67
67
|
Provides-Extra: memorydb
|
@@ -191,6 +191,29 @@ Options:
|
|
191
191
|
--m INTEGER hnsw m
|
192
192
|
--ef-construction INTEGER hnsw ef-construction
|
193
193
|
--ef-search INTEGER hnsw ef-search
|
194
|
+
--quantization-type [none|halfvec]
|
195
|
+
quantization type for vectors
|
196
|
+
--custom-case-name TEXT Custom case name i.e. PerformanceCase1536D50K
|
197
|
+
--custom-case-description TEXT Custom name description
|
198
|
+
--custom-case-load-timeout INTEGER
|
199
|
+
Custom case load timeout [default: 36000]
|
200
|
+
--custom-case-optimize-timeout INTEGER
|
201
|
+
Custom case optimize timeout [default: 36000]
|
202
|
+
--custom-dataset-name TEXT
|
203
|
+
Dataset name i.e OpenAI
|
204
|
+
--custom-dataset-dir TEXT Dataset directory i.e. openai_medium_500k
|
205
|
+
--custom-dataset-size INTEGER Dataset size i.e. 500000
|
206
|
+
--custom-dataset-dim INTEGER Dataset dimension
|
207
|
+
--custom-dataset-metric-type TEXT
|
208
|
+
Dataset distance metric [default: COSINE]
|
209
|
+
--custom-dataset-file-count INTEGER
|
210
|
+
Dataset file count
|
211
|
+
--custom-dataset-use-shuffled / --skip-custom-dataset-use-shuffled
|
212
|
+
Use shuffled custom dataset or skip [default: custom-dataset-
|
213
|
+
use-shuffled]
|
214
|
+
--custom-dataset-with-gt / --skip-custom-dataset-with-gt
|
215
|
+
Custom dataset with ground truth or skip [default: custom-dataset-
|
216
|
+
with-gt]
|
194
217
|
--help Show this message and exit.
|
195
218
|
```
|
196
219
|
#### Using a configuration file.
|
@@ -535,6 +558,8 @@ def ZillizAutoIndex(**parameters: Unpack[ZillizTypedDict]):
|
|
535
558
|
3. Update db_config and db_case_config to match client requirements
|
536
559
|
4. Continue to add new functions for each index config.
|
537
560
|
5. Import the client cli module and command to vectordb_bench/cli/vectordbbench.py (for databases with multiple commands (index configs), this only needs to be done for one command)
|
561
|
+
6. Import the `get_custom_case_config` function from `vectordb_bench/cli/cli.py` and use it to add a new key `custom_case` to the `parameters` variable within the command.
|
562
|
+
|
538
563
|
|
539
564
|
> cli modules with multiple index configs:
|
540
565
|
> - pgvector: vectordb_bench/backend/clients/pgvector/cli.py
|
@@ -117,6 +117,29 @@ Options:
|
|
117
117
|
--m INTEGER hnsw m
|
118
118
|
--ef-construction INTEGER hnsw ef-construction
|
119
119
|
--ef-search INTEGER hnsw ef-search
|
120
|
+
--quantization-type [none|halfvec]
|
121
|
+
quantization type for vectors
|
122
|
+
--custom-case-name TEXT Custom case name i.e. PerformanceCase1536D50K
|
123
|
+
--custom-case-description TEXT Custom name description
|
124
|
+
--custom-case-load-timeout INTEGER
|
125
|
+
Custom case load timeout [default: 36000]
|
126
|
+
--custom-case-optimize-timeout INTEGER
|
127
|
+
Custom case optimize timeout [default: 36000]
|
128
|
+
--custom-dataset-name TEXT
|
129
|
+
Dataset name i.e OpenAI
|
130
|
+
--custom-dataset-dir TEXT Dataset directory i.e. openai_medium_500k
|
131
|
+
--custom-dataset-size INTEGER Dataset size i.e. 500000
|
132
|
+
--custom-dataset-dim INTEGER Dataset dimension
|
133
|
+
--custom-dataset-metric-type TEXT
|
134
|
+
Dataset distance metric [default: COSINE]
|
135
|
+
--custom-dataset-file-count INTEGER
|
136
|
+
Dataset file count
|
137
|
+
--custom-dataset-use-shuffled / --skip-custom-dataset-use-shuffled
|
138
|
+
Use shuffled custom dataset or skip [default: custom-dataset-
|
139
|
+
use-shuffled]
|
140
|
+
--custom-dataset-with-gt / --skip-custom-dataset-with-gt
|
141
|
+
Custom dataset with ground truth or skip [default: custom-dataset-
|
142
|
+
with-gt]
|
120
143
|
--help Show this message and exit.
|
121
144
|
```
|
122
145
|
#### Using a configuration file.
|
@@ -461,6 +484,8 @@ def ZillizAutoIndex(**parameters: Unpack[ZillizTypedDict]):
|
|
461
484
|
3. Update db_config and db_case_config to match client requirements
|
462
485
|
4. Continue to add new functions for each index config.
|
463
486
|
5. Import the client cli module and command to vectordb_bench/cli/vectordbbench.py (for databases with multiple commands (index configs), this only needs to be done for one command)
|
487
|
+
6. Import the `get_custom_case_config` function from `vectordb_bench/cli/cli.py` and use it to add a new key `custom_case` to the `parameters` variable within the command.
|
488
|
+
|
464
489
|
|
465
490
|
> cli modules with multiple index configs:
|
466
491
|
> - pgvector: vectordb_bench/backend/clients/pgvector/cli.py
|
@@ -56,7 +56,7 @@ all = [
|
|
56
56
|
"weaviate-client",
|
57
57
|
"elasticsearch",
|
58
58
|
"pgvector",
|
59
|
-
"pgvecto_rs[psycopg3]>=0.2.
|
59
|
+
"pgvecto_rs[psycopg3]>=0.2.2",
|
60
60
|
"sqlalchemy",
|
61
61
|
"redis",
|
62
62
|
"chromadb",
|
@@ -72,7 +72,7 @@ weaviate = [ "weaviate-client" ]
|
|
72
72
|
elastic = [ "elasticsearch" ]
|
73
73
|
pgvector = [ "psycopg", "psycopg-binary", "pgvector" ]
|
74
74
|
pgvectorscale = [ "psycopg", "psycopg-binary", "pgvector" ]
|
75
|
-
pgvecto_rs = [ "pgvecto_rs[psycopg3]>=0.2.
|
75
|
+
pgvecto_rs = [ "pgvecto_rs[psycopg3]>=0.2.2" ]
|
76
76
|
redis = [ "redis" ]
|
77
77
|
memorydb = [ "memorydb" ]
|
78
78
|
chromadb = [ "chromadb" ]
|
@@ -3,7 +3,7 @@ from contextlib import contextmanager
|
|
3
3
|
import time
|
4
4
|
from typing import Iterable, Type
|
5
5
|
from ..api import VectorDB, DBCaseConfig, DBConfig, IndexType
|
6
|
-
from .config import AWSOpenSearchConfig, AWSOpenSearchIndexConfig
|
6
|
+
from .config import AWSOpenSearchConfig, AWSOpenSearchIndexConfig, AWSOS_Engine
|
7
7
|
from opensearchpy import OpenSearch
|
8
8
|
from opensearchpy.helpers import bulk
|
9
9
|
|
@@ -83,7 +83,7 @@ class AWSOpenSearch(VectorDB):
|
|
83
83
|
|
84
84
|
@contextmanager
|
85
85
|
def init(self) -> None:
|
86
|
-
"""connect to
|
86
|
+
"""connect to opensearch"""
|
87
87
|
self.client = OpenSearch(**self.db_config)
|
88
88
|
|
89
89
|
yield
|
@@ -97,7 +97,7 @@ class AWSOpenSearch(VectorDB):
|
|
97
97
|
metadata: list[int],
|
98
98
|
**kwargs,
|
99
99
|
) -> tuple[int, Exception]:
|
100
|
-
"""Insert the embeddings to the
|
100
|
+
"""Insert the embeddings to the opensearch."""
|
101
101
|
assert self.client is not None, "should self.init() first"
|
102
102
|
|
103
103
|
insert_data = []
|
@@ -136,13 +136,15 @@ class AWSOpenSearch(VectorDB):
|
|
136
136
|
body = {
|
137
137
|
"size": k,
|
138
138
|
"query": {"knn": {self.vector_col_name: {"vector": query, "k": k}}},
|
139
|
+
**({"filter": {"range": {self.id_col_name: {"gt": filters["id"]}}}} if filters else {})
|
139
140
|
}
|
140
141
|
try:
|
141
|
-
resp = self.client.search(index=self.index_name, body=body)
|
142
|
+
resp = self.client.search(index=self.index_name, body=body,size=k,_source=False,docvalue_fields=[self.id_col_name],stored_fields="_none_",filter_path=[f"hits.hits.fields.{self.id_col_name}"],)
|
142
143
|
log.info(f'Search took: {resp["took"]}')
|
143
144
|
log.info(f'Search shards: {resp["_shards"]}')
|
144
145
|
log.info(f'Search hits total: {resp["hits"]["total"]}')
|
145
|
-
result = [
|
146
|
+
result = [h["fields"][self.id_col_name][0] for h in resp["hits"]["hits"]]
|
147
|
+
#result = [int(d["_id"]) for d in resp["hits"]["hits"]]
|
146
148
|
# log.info(f'success! length={len(res)}')
|
147
149
|
|
148
150
|
return result
|
@@ -152,7 +154,46 @@ class AWSOpenSearch(VectorDB):
|
|
152
154
|
|
153
155
|
def optimize(self):
|
154
156
|
"""optimize will be called between insertion and search in performance cases."""
|
155
|
-
|
157
|
+
# Call refresh first to ensure that all segments are created
|
158
|
+
self._refresh_index()
|
159
|
+
self._do_force_merge()
|
160
|
+
# Call refresh again to ensure that the index is ready after force merge.
|
161
|
+
self._refresh_index()
|
162
|
+
# ensure that all graphs are loaded in memory and ready for search
|
163
|
+
self._load_graphs_to_memory()
|
164
|
+
|
165
|
+
def _refresh_index(self):
|
166
|
+
log.debug(f"Starting refresh for index {self.index_name}")
|
167
|
+
SECONDS_WAITING_FOR_REFRESH_API_CALL_SEC = 30
|
168
|
+
while True:
|
169
|
+
try:
|
170
|
+
log.info(f"Starting the Refresh Index..")
|
171
|
+
self.client.indices.refresh(index=self.index_name)
|
172
|
+
break
|
173
|
+
except Exception as e:
|
174
|
+
log.info(
|
175
|
+
f"Refresh errored out. Sleeping for {SECONDS_WAITING_FOR_REFRESH_API_CALL_SEC} sec and then Retrying : {e}")
|
176
|
+
time.sleep(SECONDS_WAITING_FOR_REFRESH_API_CALL_SEC)
|
177
|
+
continue
|
178
|
+
log.debug(f"Completed refresh for index {self.index_name}")
|
179
|
+
|
180
|
+
def _do_force_merge(self):
|
181
|
+
log.debug(f"Starting force merge for index {self.index_name}")
|
182
|
+
force_merge_endpoint = f'/{self.index_name}/_forcemerge?max_num_segments=1&wait_for_completion=false'
|
183
|
+
force_merge_task_id = self.client.transport.perform_request('POST', force_merge_endpoint)['task']
|
184
|
+
SECONDS_WAITING_FOR_FORCE_MERGE_API_CALL_SEC = 30
|
185
|
+
while True:
|
186
|
+
time.sleep(SECONDS_WAITING_FOR_FORCE_MERGE_API_CALL_SEC)
|
187
|
+
task_status = self.client.tasks.get(task_id=force_merge_task_id)
|
188
|
+
if task_status['completed']:
|
189
|
+
break
|
190
|
+
log.debug(f"Completed force merge for index {self.index_name}")
|
191
|
+
|
192
|
+
def _load_graphs_to_memory(self):
|
193
|
+
if self.case_config.engine != AWSOS_Engine.lucene:
|
194
|
+
log.info("Calling warmup API to load graphs into memory")
|
195
|
+
warmup_endpoint = f'/_plugins/_knn/warmup/{self.index_name}'
|
196
|
+
self.client.transport.perform_request('GET', warmup_endpoint)
|
156
197
|
|
157
198
|
def ready_to_load(self):
|
158
199
|
"""ready_to_load will be called before load in load cases."""
|
@@ -1,9 +1,10 @@
|
|
1
|
+
import logging
|
1
2
|
from enum import Enum
|
2
3
|
from pydantic import SecretStr, BaseModel
|
3
4
|
|
4
5
|
from ..api import DBConfig, DBCaseConfig, MetricType, IndexType
|
5
6
|
|
6
|
-
|
7
|
+
log = logging.getLogger(__name__)
|
7
8
|
class AWSOpenSearchConfig(DBConfig, BaseModel):
|
8
9
|
host: str = ""
|
9
10
|
port: int = 443
|
@@ -31,14 +32,18 @@ class AWSOS_Engine(Enum):
|
|
31
32
|
|
32
33
|
class AWSOpenSearchIndexConfig(BaseModel, DBCaseConfig):
|
33
34
|
metric_type: MetricType = MetricType.L2
|
34
|
-
engine: AWSOS_Engine = AWSOS_Engine.
|
35
|
-
efConstruction: int =
|
36
|
-
|
35
|
+
engine: AWSOS_Engine = AWSOS_Engine.faiss
|
36
|
+
efConstruction: int = 256
|
37
|
+
efSearch: int = 256
|
38
|
+
M: int = 16
|
37
39
|
|
38
40
|
def parse_metric(self) -> str:
|
39
41
|
if self.metric_type == MetricType.IP:
|
40
|
-
return "innerproduct"
|
42
|
+
return "innerproduct"
|
41
43
|
elif self.metric_type == MetricType.COSINE:
|
44
|
+
if self.engine == AWSOS_Engine.faiss:
|
45
|
+
log.info(f"Using metric type as innerproduct because faiss doesn't support cosine as metric type for Opensearch")
|
46
|
+
return "innerproduct"
|
42
47
|
return "cosinesimil"
|
43
48
|
return "l2"
|
44
49
|
|
@@ -49,7 +54,8 @@ class AWSOpenSearchIndexConfig(BaseModel, DBCaseConfig):
|
|
49
54
|
"engine": self.engine.value,
|
50
55
|
"parameters": {
|
51
56
|
"ef_construction": self.efConstruction,
|
52
|
-
"m": self.M
|
57
|
+
"m": self.M,
|
58
|
+
"ef_search": self.efSearch
|
53
59
|
}
|
54
60
|
}
|
55
61
|
return params
|
{vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/aws_opensearch/run.py
RENAMED
@@ -40,12 +40,12 @@ def create_index(client, index_name):
|
|
40
40
|
"type": "knn_vector",
|
41
41
|
"dimension": _DIM,
|
42
42
|
"method": {
|
43
|
-
"engine": "
|
43
|
+
"engine": "faiss",
|
44
44
|
"name": "hnsw",
|
45
45
|
"space_type": "l2",
|
46
46
|
"parameters": {
|
47
|
-
"ef_construction":
|
48
|
-
"m":
|
47
|
+
"ef_construction": 256,
|
48
|
+
"m": 16,
|
49
49
|
}
|
50
50
|
}
|
51
51
|
}
|
@@ -108,12 +108,43 @@ def search(client, index_name):
|
|
108
108
|
print('\nSearch not ready, sleep 1s')
|
109
109
|
time.sleep(1)
|
110
110
|
|
111
|
+
def optimize_index(client, index_name):
|
112
|
+
print(f"Starting force merge for index {index_name}")
|
113
|
+
force_merge_endpoint = f'/{index_name}/_forcemerge?max_num_segments=1&wait_for_completion=false'
|
114
|
+
force_merge_task_id = client.transport.perform_request('POST', force_merge_endpoint)['task']
|
115
|
+
SECONDS_WAITING_FOR_FORCE_MERGE_API_CALL_SEC = 30
|
116
|
+
while True:
|
117
|
+
time.sleep(SECONDS_WAITING_FOR_FORCE_MERGE_API_CALL_SEC)
|
118
|
+
task_status = client.tasks.get(task_id=force_merge_task_id)
|
119
|
+
if task_status['completed']:
|
120
|
+
break
|
121
|
+
print(f"Completed force merge for index {index_name}")
|
122
|
+
|
123
|
+
|
124
|
+
def refresh_index(client, index_name):
|
125
|
+
print(f"Starting refresh for index {index_name}")
|
126
|
+
SECONDS_WAITING_FOR_REFRESH_API_CALL_SEC = 30
|
127
|
+
while True:
|
128
|
+
try:
|
129
|
+
print(f"Starting the Refresh Index..")
|
130
|
+
client.indices.refresh(index=index_name)
|
131
|
+
break
|
132
|
+
except Exception as e:
|
133
|
+
print(
|
134
|
+
f"Refresh errored out. Sleeping for {SECONDS_WAITING_FOR_REFRESH_API_CALL_SEC} sec and then Retrying : {e}")
|
135
|
+
time.sleep(SECONDS_WAITING_FOR_REFRESH_API_CALL_SEC)
|
136
|
+
continue
|
137
|
+
print(f"Completed refresh for index {index_name}")
|
138
|
+
|
139
|
+
|
111
140
|
|
112
141
|
def main():
|
113
142
|
client = create_client()
|
114
143
|
try:
|
115
144
|
create_index(client, _INDEX_NAME)
|
116
145
|
bulk_insert(client, _INDEX_NAME)
|
146
|
+
optimize_index(client, _INDEX_NAME)
|
147
|
+
refresh_index(client, _INDEX_NAME)
|
117
148
|
search(client, _INDEX_NAME)
|
118
149
|
delete_index(client, _INDEX_NAME)
|
119
150
|
except Exception as e:
|
{vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/pgvector/cli.py
RENAMED
@@ -10,6 +10,7 @@ from ....cli.cli import (
|
|
10
10
|
IVFFlatTypedDict,
|
11
11
|
cli,
|
12
12
|
click_parameter_decorators_from_typed_dict,
|
13
|
+
get_custom_case_config,
|
13
14
|
run,
|
14
15
|
)
|
15
16
|
from vectordb_bench.backend.clients import DB
|
@@ -56,7 +57,15 @@ class PgVectorTypedDict(CommonTypedDict):
|
|
56
57
|
required=False,
|
57
58
|
),
|
58
59
|
]
|
59
|
-
|
60
|
+
quantization_type: Annotated[
|
61
|
+
Optional[str],
|
62
|
+
click.option(
|
63
|
+
"--quantization-type",
|
64
|
+
type=click.Choice(["none", "halfvec"]),
|
65
|
+
help="quantization type for vectors",
|
66
|
+
required=False,
|
67
|
+
),
|
68
|
+
]
|
60
69
|
|
61
70
|
class PgVectorIVFFlatTypedDict(PgVectorTypedDict, IVFFlatTypedDict):
|
62
71
|
...
|
@@ -69,6 +78,7 @@ def PgVectorIVFFlat(
|
|
69
78
|
):
|
70
79
|
from .config import PgVectorConfig, PgVectorIVFFlatConfig
|
71
80
|
|
81
|
+
parameters["custom_case"] = get_custom_case_config(parameters)
|
72
82
|
run(
|
73
83
|
db=DB.PgVector,
|
74
84
|
db_config=PgVectorConfig(
|
@@ -79,7 +89,10 @@ def PgVectorIVFFlat(
|
|
79
89
|
db_name=parameters["db_name"],
|
80
90
|
),
|
81
91
|
db_case_config=PgVectorIVFFlatConfig(
|
82
|
-
metric_type=None,
|
92
|
+
metric_type=None,
|
93
|
+
lists=parameters["lists"],
|
94
|
+
probes=parameters["probes"],
|
95
|
+
quantization_type=parameters["quantization_type"],
|
83
96
|
),
|
84
97
|
**parameters,
|
85
98
|
)
|
@@ -96,6 +109,7 @@ def PgVectorHNSW(
|
|
96
109
|
):
|
97
110
|
from .config import PgVectorConfig, PgVectorHNSWConfig
|
98
111
|
|
112
|
+
parameters["custom_case"] = get_custom_case_config(parameters)
|
99
113
|
run(
|
100
114
|
db=DB.PgVector,
|
101
115
|
db_config=PgVectorConfig(
|
@@ -111,6 +125,7 @@ def PgVectorHNSW(
|
|
111
125
|
ef_search=parameters["ef_search"],
|
112
126
|
maintenance_work_mem=parameters["maintenance_work_mem"],
|
113
127
|
max_parallel_workers=parameters["max_parallel_workers"],
|
128
|
+
quantization_type=parameters["quantization_type"],
|
114
129
|
),
|
115
130
|
**parameters,
|
116
131
|
)
|
{vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/pgvector/config.py
RENAMED
@@ -59,11 +59,18 @@ class PgVectorIndexConfig(BaseModel, DBCaseConfig):
|
|
59
59
|
create_index_after_load: bool = True
|
60
60
|
|
61
61
|
def parse_metric(self) -> str:
|
62
|
-
if self.
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
62
|
+
if self.quantization_type == "halfvec":
|
63
|
+
if self.metric_type == MetricType.L2:
|
64
|
+
return "halfvec_l2_ops"
|
65
|
+
elif self.metric_type == MetricType.IP:
|
66
|
+
return "halfvec_ip_ops"
|
67
|
+
return "halfvec_cosine_ops"
|
68
|
+
else:
|
69
|
+
if self.metric_type == MetricType.L2:
|
70
|
+
return "vector_l2_ops"
|
71
|
+
elif self.metric_type == MetricType.IP:
|
72
|
+
return "vector_ip_ops"
|
73
|
+
return "vector_cosine_ops"
|
67
74
|
|
68
75
|
def parse_metric_fun_op(self) -> LiteralString:
|
69
76
|
if self.metric_type == MetricType.L2:
|
@@ -143,9 +150,12 @@ class PgVectorIVFFlatConfig(PgVectorIndexConfig):
|
|
143
150
|
index: IndexType = IndexType.ES_IVFFlat
|
144
151
|
maintenance_work_mem: Optional[str] = None
|
145
152
|
max_parallel_workers: Optional[int] = None
|
153
|
+
quantization_type: Optional[str] = None
|
146
154
|
|
147
155
|
def index_param(self) -> PgVectorIndexParam:
|
148
156
|
index_parameters = {"lists": self.lists}
|
157
|
+
if self.quantization_type == "none":
|
158
|
+
self.quantization_type = None
|
149
159
|
return {
|
150
160
|
"metric": self.parse_metric(),
|
151
161
|
"index_type": self.index.value,
|
@@ -154,6 +164,7 @@ class PgVectorIVFFlatConfig(PgVectorIndexConfig):
|
|
154
164
|
),
|
155
165
|
"maintenance_work_mem": self.maintenance_work_mem,
|
156
166
|
"max_parallel_workers": self.max_parallel_workers,
|
167
|
+
"quantization_type": self.quantization_type,
|
157
168
|
}
|
158
169
|
|
159
170
|
def search_param(self) -> PgVectorSearchParam:
|
@@ -183,9 +194,12 @@ class PgVectorHNSWConfig(PgVectorIndexConfig):
|
|
183
194
|
index: IndexType = IndexType.ES_HNSW
|
184
195
|
maintenance_work_mem: Optional[str] = None
|
185
196
|
max_parallel_workers: Optional[int] = None
|
197
|
+
quantization_type: Optional[str] = None
|
186
198
|
|
187
199
|
def index_param(self) -> PgVectorIndexParam:
|
188
200
|
index_parameters = {"m": self.m, "ef_construction": self.ef_construction}
|
201
|
+
if self.quantization_type == "none":
|
202
|
+
self.quantization_type = None
|
189
203
|
return {
|
190
204
|
"metric": self.parse_metric(),
|
191
205
|
"index_type": self.index.value,
|
@@ -194,6 +208,7 @@ class PgVectorHNSWConfig(PgVectorIndexConfig):
|
|
194
208
|
),
|
195
209
|
"maintenance_work_mem": self.maintenance_work_mem,
|
196
210
|
"max_parallel_workers": self.max_parallel_workers,
|
211
|
+
"quantization_type": self.quantization_type,
|
197
212
|
}
|
198
213
|
|
199
214
|
def search_param(self) -> PgVectorSearchParam:
|
{vectordb_bench-0.0.13 → vectordb_bench-0.0.14}/vectordb_bench/backend/clients/pgvector/pgvector.py
RENAMED
@@ -22,7 +22,7 @@ class PgVector(VectorDB):
|
|
22
22
|
conn: psycopg.Connection[Any] | None = None
|
23
23
|
cursor: psycopg.Cursor[Any] | None = None
|
24
24
|
|
25
|
-
|
25
|
+
_filtered_search: sql.Composed
|
26
26
|
_unfiltered_search: sql.Composed
|
27
27
|
|
28
28
|
def __init__(
|
@@ -112,15 +112,63 @@ class PgVector(VectorDB):
|
|
112
112
|
self.cursor.execute(command)
|
113
113
|
self.conn.commit()
|
114
114
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
115
|
+
index_param = self.case_config.index_param()
|
116
|
+
# The following sections assume that the quantization_type value matches the quantization function name
|
117
|
+
if index_param["quantization_type"] != None:
|
118
|
+
self._filtered_search = sql.Composed(
|
119
|
+
[
|
120
|
+
sql.SQL(
|
121
|
+
"SELECT id FROM public.{table_name} WHERE id >= %s ORDER BY embedding::{quantization_type}({dim}) "
|
122
|
+
).format(
|
123
|
+
table_name=sql.Identifier(self.table_name),
|
124
|
+
quantization_type=sql.SQL(index_param["quantization_type"]),
|
125
|
+
dim=sql.Literal(self.dim),
|
126
|
+
),
|
127
|
+
sql.SQL(self.case_config.search_param()["metric_fun_op"]),
|
128
|
+
sql.SQL(" %s::{quantization_type}({dim}) LIMIT %s::int").format(
|
129
|
+
quantization_type=sql.SQL(index_param["quantization_type"]),
|
130
|
+
dim=sql.Literal(self.dim),
|
131
|
+
),
|
132
|
+
]
|
133
|
+
)
|
134
|
+
else:
|
135
|
+
self._filtered_search = sql.Composed(
|
136
|
+
[
|
137
|
+
sql.SQL(
|
138
|
+
"SELECT id FROM public.{table_name} WHERE id >= %s ORDER BY embedding "
|
139
|
+
).format(table_name=sql.Identifier(self.table_name)),
|
140
|
+
sql.SQL(self.case_config.search_param()["metric_fun_op"]),
|
141
|
+
sql.SQL(" %s::vector LIMIT %s::int"),
|
142
|
+
]
|
143
|
+
)
|
144
|
+
|
145
|
+
if index_param["quantization_type"] != None:
|
146
|
+
self._unfiltered_search = sql.Composed(
|
147
|
+
[
|
148
|
+
sql.SQL(
|
149
|
+
"SELECT id FROM public.{table_name} ORDER BY embedding::{quantization_type}({dim}) "
|
150
|
+
).format(
|
151
|
+
table_name=sql.Identifier(self.table_name),
|
152
|
+
quantization_type=sql.SQL(index_param["quantization_type"]),
|
153
|
+
dim=sql.Literal(self.dim),
|
154
|
+
),
|
155
|
+
sql.SQL(self.case_config.search_param()["metric_fun_op"]),
|
156
|
+
sql.SQL(" %s::{quantization_type}({dim}) LIMIT %s::int").format(
|
157
|
+
quantization_type=sql.SQL(index_param["quantization_type"]),
|
158
|
+
dim=sql.Literal(self.dim),
|
159
|
+
),
|
160
|
+
]
|
161
|
+
)
|
162
|
+
else:
|
163
|
+
self._unfiltered_search = sql.Composed(
|
164
|
+
[
|
165
|
+
sql.SQL("SELECT id FROM public.{} ORDER BY embedding ").format(
|
166
|
+
sql.Identifier(self.table_name)
|
167
|
+
),
|
168
|
+
sql.SQL(self.case_config.search_param()["metric_fun_op"]),
|
169
|
+
sql.SQL(" %s::vector LIMIT %s::int"),
|
170
|
+
]
|
171
|
+
)
|
124
172
|
|
125
173
|
try:
|
126
174
|
yield
|
@@ -255,17 +303,34 @@ class PgVector(VectorDB):
|
|
255
303
|
else:
|
256
304
|
with_clause = sql.Composed(())
|
257
305
|
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
306
|
+
if index_param["quantization_type"] != None:
|
307
|
+
index_create_sql = sql.SQL(
|
308
|
+
"""
|
309
|
+
CREATE INDEX IF NOT EXISTS {index_name} ON public.{table_name}
|
310
|
+
USING {index_type} ((embedding::{quantization_type}({dim})) {embedding_metric})
|
311
|
+
"""
|
312
|
+
).format(
|
313
|
+
index_name=sql.Identifier(self._index_name),
|
314
|
+
table_name=sql.Identifier(self.table_name),
|
315
|
+
index_type=sql.Identifier(index_param["index_type"]),
|
316
|
+
# This assumes that the quantization_type value matches the quantization function name
|
317
|
+
quantization_type=sql.SQL(index_param["quantization_type"]),
|
318
|
+
dim=self.dim,
|
319
|
+
embedding_metric=sql.Identifier(index_param["metric"]),
|
320
|
+
)
|
321
|
+
else:
|
322
|
+
index_create_sql = sql.SQL(
|
323
|
+
"""
|
324
|
+
CREATE INDEX IF NOT EXISTS {index_name} ON public.{table_name}
|
325
|
+
USING {index_type} (embedding {embedding_metric})
|
326
|
+
"""
|
327
|
+
).format(
|
328
|
+
index_name=sql.Identifier(self._index_name),
|
329
|
+
table_name=sql.Identifier(self.table_name),
|
330
|
+
index_type=sql.Identifier(index_param["index_type"]),
|
331
|
+
embedding_metric=sql.Identifier(index_param["metric"]),
|
332
|
+
)
|
333
|
+
|
269
334
|
index_create_sql_with_with_clause = (
|
270
335
|
index_create_sql + with_clause
|
271
336
|
).join(" ")
|
@@ -342,9 +407,14 @@ class PgVector(VectorDB):
|
|
342
407
|
assert self.cursor is not None, "Cursor is not initialized"
|
343
408
|
|
344
409
|
q = np.asarray(query)
|
345
|
-
|
346
|
-
|
347
|
-
self.
|
348
|
-
|
410
|
+
if filters:
|
411
|
+
gt = filters.get("id")
|
412
|
+
result = self.cursor.execute(
|
413
|
+
self._filtered_search, (gt, q, k), prepare=True, binary=True
|
414
|
+
)
|
415
|
+
else:
|
416
|
+
result = self.cursor.execute(
|
417
|
+
self._unfiltered_search, (q, k), prepare=True, binary=True
|
418
|
+
)
|
349
419
|
|
350
420
|
return [int(i[0]) for i in result.fetchall()]
|