GenericVectorBuilder

Benchmark

Vector search benchmark

These benchmarks were taken from the eShopOnWeb data set (524 vectors of 1024 dimensions) and from the 20 golden questions, which ran the speed test.

The queries are read from ~/ForClaude/evalkit/questions_golden.json.

sources
  • results results:pipeline = eshoponweb
  • results results:rows = 524
  • results results:dimension = 1024
  • results results:queryCount = 20
  • consolidated consolidated:queries.recorded = golden: 20 labelled questions from ~/ForClaude/evalkit/questions_golden.json, embedded with qwen3-emb-0.6b (cached in ~/gvb-data/bench-cache/golden-eshoponweb-68df42ca69efa079.json, no embedding calls)

Multi search, 8 searchers at once: database engines in order

Most searches per second first. Searches per second is the median of the 6 runs. The ms per search is worked out as one second divided by the searches per second, so it is not a timed latency. Each difference is from the row above it.

EngineSearches per secondms per searchDifference from the row above, ms per search
mariadb5,9230.169first in the list
redis within run-to-run spread of the row above5,1790.193+0.024
redis holds its data in memory its saved docs page says 'Redis is an in-memory but persistent on disk database', and its compose file sets save "300 1" and appendonly no. Read this row with that in mind.
sources
  • doc doc:design/engine-docs/redis-faq-2026-10-07.html#Redis is an in-memory but persistent on disk database = Redis is an in-memory but persistent on disk database
  • file deploy/engines/redis.compose.yaml#--save "300 1" = --save "300 1"
  • file deploy/engines/redis.compose.yaml#--appendonly no = --appendonly no
pgvector within run-to-run spread of the row above4,0040.250+0.057
qdrant-hnsw within run-to-run spread of the row above3,4600.289+0.039
qdrant within run-to-run spread of the row above3,2840.305+0.016
oracle within run-to-run spread of the row above2,8030.357+0.052
elasticsearch within run-to-run spread of the row above2,7010.370+0.013
mongodb within run-to-run spread of the row above2,1230.471+0.101
vespa within run-to-run spread of the row above1,5600.641+0.170
opensearch within run-to-run spread of the row above1,4920.670+0.029
milvus within run-to-run spread of the row above1,2640.791+0.121
sqlitevec within run-to-run spread of the row above1,1370.879+0.088
chroma within run-to-run spread of the row above7781.286+0.406
sql-diskann within run-to-run spread of the row above6871.457+0.171
sql within run-to-run spread of the row above6041.655+0.198
duckdb within run-to-run spread of the row above5771.733+0.078
typesense within run-to-run spread of the row above5741.741+0.008
weaviate3063.270+1.530
Not ranked
clickhousenot held, not ranked

A row marked within run-to-run spread is not separated from the row above by the report's test. The order shown is the order of the medians.

A row marked not held has figures from a timed pass the tool recorded as not held: the engine was still changing when it was timed. The row is shown and is not ranked.

The figures of a row that is not ranked are in the full results.

Build that measured the runs: v7 not recorded, v8 9b924200abc3. Set: published-2026-10-08.

In this public copy, machine names, network addresses and home-folder paths are replaced; the checksums in the results refer to the unredacted run files.