GenericVectorBuilder

Benchmark

Summary and all runs

Vector engine benchmark: eshoponweb

Run started 3 Oct 2026, 18:44 UTC. Data: eShopOnWeb, 524 vectors. Queries: 20 labelled questions.

Machine: CPU Intel(R) Xeon(R) CPU E5-1620 v3 @ 3.50GHz; Logical CPUs 8; RAM (GiB) 62.7; OS Ubuntu 24.04.5 LTS, kernel 6.8.0-142-generic; Governor not recorded; Partition not recorded; Release build.

Warm-up, as this run's notes record it: Latency is client-side wall time around each search (network and driver included), one query at a time, after 20 warm-up queries; at least 200 samples (small query sets are repeated).

Enginep50 (ms)Searches per second, one searcherSearches per second, eight searchers at onceExact mode p50 (ms)Client CPU per search, one searcher (ms)Recall in hitsFlags
Chroma6.01168331--200 of 200
ClickHouse6.251677116.53-197 of 200
DuckDB4.062572005.86-200 of 200
Elasticsearch13.191482,6324.35-200 of 200Pm
MariaDB2.344354,5591.66-200 of 200
Milvus7.421511,724--200 of 200
MongoDB Atlas Local8.143082,8072.66-200 of 200Pm
OpenSearch12.291301,8755.50-200 of 200Pm
Oracle 23ai Free5.602696954.19-200 of 200Pm
Qdrant (HNSW)2.424123,4320.85-200 of 200
Qdrant (exact)2.794083,444--200 of 200
Redis1.517682,0111.34-200 of 200Pm
SQL Server 20256.52196806--200 of 200Pm
Typesense8.92959749.26-200 of 200
Vespa6.531741,5532.22-200 of 200
Weaviate15.3664541--200 of 200
pgvector2.874033,8312.36-200 of 200Pm
sqlite-vec2.165455281.95-200 of 200Pm

Engines are listed in alphabetical order. The table does not rank them.

A dash means the table has no figure there.

The small markers after an engine name are flags. Hover a marker for its evidence, or read the list below the tables.

  • Pm p50-mean-inconsistent The p50 and the mean from the one-searcher pass disagree by more than the limit named in the evidence.
Evidence behind the flags
  • Elasticsearch p50-mean-inconsistent p50 13.19 ms, mean 6.75 ms, p50/mean 1.95; limits: p50 above the mean by more than 1.15 times, or the mean above p50 by more than 1.5 times
  • MongoDB Atlas Local p50-mean-inconsistent p50 8.14 ms, mean 3.25 ms, p50/mean 2.50; limits: p50 above the mean by more than 1.15 times, or the mean above p50 by more than 1.5 times
  • OpenSearch p50-mean-inconsistent p50 12.29 ms, mean 7.70 ms, p50/mean 1.60; limits: p50 above the mean by more than 1.15 times, or the mean above p50 by more than 1.5 times
  • Oracle 23ai Free p50-mean-inconsistent p50 5.60 ms, mean 3.71 ms, p50/mean 1.51; limits: p50 above the mean by more than 1.15 times, or the mean above p50 by more than 1.5 times
  • Redis p50-mean-inconsistent p50 1.51 ms, mean 1.30 ms, p50/mean 1.16; limits: p50 above the mean by more than 1.15 times, or the mean above p50 by more than 1.5 times
  • SQL Server 2025 p50-mean-inconsistent p50 6.52 ms, mean 5.10 ms, p50/mean 1.28; limits: p50 above the mean by more than 1.15 times, or the mean above p50 by more than 1.5 times
  • pgvector p50-mean-inconsistent p50 2.87 ms, mean 2.48 ms, p50/mean 1.16; limits: p50 above the mean by more than 1.15 times, or the mean above p50 by more than 1.5 times
  • sqlite-vec p50-mean-inconsistent p50 2.16 ms, mean 1.83 ms, p50/mean 1.18; limits: p50 above the mean by more than 1.15 times, or the mean above p50 by more than 1.5 times

Full results

This report is printed as the run wrote it, except for any sentence a note above it says was left out. This page does not check the engine texts in it. The summary page's facts table gives the label of each fact it uses.

Run 2026-10-03T18:44:45Z (run-all). Command line:

~/ForClaude/GenericVectorBuilder/src/GenericVectorBuilder.Bench/bin/Release/net10.0/GenericVectorBuilder.Bench.dll run-all --pipeline eshoponweb --targets sql,qdrant,qdrant-hnsw,pgvector,mariadb,oracle,redis,mongodb,clickhouse,milvus,weaviate,chroma,elasticsearch,opensearch,typesense,vespa,duckdb,sqlitevec --queries golden
engineindexload rows/sp50 msp95 msp99 msQPS@1QPS@8recall@10nDCG@10RAMdisk
sqlexact VECTOR_DISTANCE cosine, no vector index (full scan)5476.529.9811.7196.0806.21.0000.5184.13 GiB5.15 MiB
qdrantexact search (the builder's setting), HNSW m=16 ef_construct=100 built but not used2,3552.793.324.21407.73443.81.0000.5184.21 GiB328.14 MiB
qdrant-hnswHNSW m=16 ef_construct=100, hnsw_ef=server default, cosine6,6272.422.722.98412.13432.31.0000.5184.21 GiB328.14 MiB
pgvectorHNSW vector_cosine_ops m=16 ef_construction=128, hnsw.ef_search=100 per query, float32 vector(n), cosine; exact mode = same query with index scans off (sequential scan)5282.874.114.90403.13830.91.0000.518101.3 MiB7.62 MiB
mariadbVECTOR INDEX (HNSW variant) DISTANCE=cosine, M=16 (no ef_construction setting exists), mhnsw_ef_search=3200, mhnsw_max_cache_size 4G; exact mode = IGNORE INDEX full scan6682.342.722.91435.34559.31.0000.518156.1 MiB22.01 MiB
oracleHNSW in-memory neighbor graph NEIGHBORS=16 EFCONSTRUCTION=128, EFSEARCH=100 per query, cosine; exact mode = FETCH EXACT FIRST (full scan)1,6215.606.857.56269.3695.11.0000.5182.09 GiB0 B
redisHNSW TYPE FLOAT32 M=16 EF_CONSTRUCTION=128, EF_RUNTIME=100 per query, cosine; exact mode = FLAT index built on first exact query6,3471.512.022.51767.52011.01.0000.51821 MiB0 B
mongodbvectorSearch index, HNSW maxEdges=16 numEdgeCandidates=128, float32 binData, cosine, numCandidates=20x hits (min 100); exact mode = $vectorSearch exact:true1,8038.1415.817.5307.72807.41.0000.518687.6 MiB115.72 KiB
clickhousevector_similarity HNSW cosineDistance, quantization bf16, M=16 ef_construction=128, hnsw_candidate_list_size_for_search=256, rescoring off; exact mode = full scan with skip indexes off2,7116.258.039.62166.8711.30.9850.5201.05 GiB210.16 MiB
milvusHNSW M=16 efConstruction=128, ef=100, metric COSINE, Strong consistency searches; approximate only (no exact mode)8537.428.239.96150.81723.61.0000.518204.8 MiB8.78 MiB
weaviateHNSW maxConnections(M)=16 efConstruction=128, ef=-1 (dynamic: limit x 8 clamped 100..500), cosine, no quantization; approximate only (no exact mode)57515.423.326.363.8541.11.0000.518107.4 MiB2.88 MiB
chromaHNSW M=16 ef_construction=128, ef_search=100 (Chroma default), cosine; approximate only (no exact mode)4316.016.807.34167.6330.91.0000.51851.85 MiB414.16 KiB
elasticsearchHNSW float32, no quantization, m=16, ef_construction=128, cosine; search k=top, num_candidates=100; 1 shard, 0 replicas47413.216.817.8148.12631.91.0000.5182.6 GiB9.46 MiB
opensearchfaiss HNSW float32, no compression, m=16, ef_construction=128, cosinesimil; search k=top, ef_search=100; 1 shard, 0 replicas38612.315.016.5129.81874.61.0000.5182.63 GiB16.07 MiB
typesenseHNSW float32 (hnswlib), m=16, ef_construction=128, cosine; search k=top, ef=100; exact mode = filter ordinal:>=0 with flat_search_cutoff; index held in memory7098.9212.513.395.4974.41.0000.518120.4 MiB389.1 MiB
vespaHNSW float32 tensor, prenormalized-angular (cosine), max-links-per-node=16, neighbors-to-explore-at-insert=128; search targetHits=top, ef=100 via exploreAdditionalHits; exact mode = approximate:false; vectors held in memory5186.538.249.07174.21552.91.0000.5182.89 GiB414.97 MiB
duckdbHNSW (vss extension) FLOAT[n] metric=cosine m=16 ef_construction=128, ef_search=100 per connection, persistent (hnsw_enable_experimental_persistence=true, checkpoint_threshold=256MB); exact mode = array_cosine_similarity sequential scan; score = 1 - cosine distance1,5694.065.286.05257.3199.51.0000.518-2.9 MiB
sqlitevecvec0 brute-force scan, no ANN index (exact), float32, cosine distance, default chunk_size=1024; score = 1 - cosine distance4,0272.162.482.73545.2528.11.0000.518-9.72 MiB

Details per target

SQL Server 2025 sql
Qdrant (exact) qdrant
Qdrant (HNSW) qdrant-hnsw
pgvector
MariaDB mariadb
Oracle 23ai Free oracle
Redis redis
MongoDB Atlas Local mongodb
ClickHouse clickhouse
Milvus milvus
Weaviate weaviate
Chroma chroma
Elasticsearch elasticsearch
OpenSearch opensearch
Typesense typesense
Vespa vespa
DuckDB duckdb
sqlite-vec sqlitevec

Notes

Raw files

The raw files below hold the recorded statements that the corrections above refer to, as written.