Skip to content

Tune HNSW Queries

HNSW build options are fixed when the index is built. vectoron.hnsw_ef_search is applied at query time.

DROP TABLE IF EXISTS akasicdb_example_hnsw_articles;

CREATE TABLE akasicdb_example_hnsw_articles (
  id integer PRIMARY KEY,
  title text NOT NULL,
  embedding vector(4) NOT NULL
);

INSERT INTO akasicdb_example_hnsw_articles (id, title, embedding) VALUES
  (1, 'vector search overview', ARRAY[0.10,0.80,0.05,0.00]::real[]::vector),
  (2, 'nearest neighbor terms', ARRAY[0.12,0.78,0.06,0.01]::real[]::vector),
  (3, 'index build options', ARRAY[0.09,0.82,0.04,0.00]::real[]::vector),
  (4, 'query search width', ARRAY[0.15,0.74,0.08,0.02]::real[]::vector),
  (5, 'filtered search', ARRAY[0.20,0.65,0.10,0.03]::real[]::vector),
  (6, 'index status checks', ARRAY[0.24,0.60,0.12,0.03]::real[]::vector),
  (7, 'product taxonomy', ARRAY[0.30,0.50,0.20,0.05]::real[]::vector),
  (8, 'document ranking', ARRAY[0.32,0.48,0.22,0.05]::real[]::vector),
  (9, 'graph traversal', ARRAY[0.50,0.30,0.35,0.08]::real[]::vector),
  (10, 'storage checkpoint', ARRAY[0.55,0.25,0.40,0.10]::real[]::vector),
  (11, 'backup planning', ARRAY[0.60,0.20,0.42,0.12]::real[]::vector),
  (12, 'access control', ARRAY[0.65,0.18,0.44,0.14]::real[]::vector),
  (13, 'event ingestion', ARRAY[0.70,0.16,0.46,0.16]::real[]::vector),
  (14, 'analytics refresh', ARRAY[0.74,0.14,0.48,0.18]::real[]::vector),
  (15, 'metadata filters', ARRAY[0.21,0.64,0.11,0.03]::real[]::vector),
  (16, 'distance operators', ARRAY[0.13,0.77,0.05,0.01]::real[]::vector),
  (17, 'index build queue', ARRAY[0.25,0.59,0.14,0.03]::real[]::vector),
  (18, 'service limits', ARRAY[0.68,0.17,0.46,0.15]::real[]::vector),
  (19, 'search api design', ARRAY[0.16,0.76,0.10,0.02]::real[]::vector),
  (20, 'ranking eval', ARRAY[0.14,0.79,0.09,0.01]::real[]::vector),
  (21, 'vector schema', ARRAY[0.11,0.81,0.03,0.00]::real[]::vector),
  (22, 'index memory review', ARRAY[0.22,0.62,0.13,0.03]::real[]::vector),
  (23, 'content moderation', ARRAY[0.40,0.40,0.28,0.07]::real[]::vector),
  (24, 'stream processing', ARRAY[0.78,0.12,0.50,0.20]::real[]::vector),
  (25, 'catalog sync', ARRAY[0.34,0.46,0.24,0.06]::real[]::vector),
  (26, 'observability plan', ARRAY[0.28,0.58,0.18,0.04]::real[]::vector),
  (27, 'sql migration', ARRAY[0.62,0.22,0.43,0.11]::real[]::vector),
  (28, 'read replica notes', ARRAY[0.66,0.19,0.45,0.13]::real[]::vector),
  (29, 'feature flags', ARRAY[0.72,0.15,0.47,0.17]::real[]::vector),
  (30, 'dashboard refresh', ARRAY[0.76,0.13,0.49,0.19]::real[]::vector),
  (31, 'tenant routing', ARRAY[0.36,0.44,0.26,0.06]::real[]::vector),
  (32, 'operations review', ARRAY[0.29,0.57,0.19,0.04]::real[]::vector);

CREATE INDEX akasicdb_hnsw_articles_embedding_idx
ON akasicdb_example_hnsw_articles
USING vectoron (embedding vector_l2_ops)
WITH (options = $$
[indexing.hnsw]
m = 8
ef_construction = 120
$$);

SELECT fence_vector_index('akasicdb_hnsw_articles_embedding_idx'::regclass);

BEGIN;
SET LOCAL vectoron.hnsw_ef_search = 64;

SELECT id, title
FROM akasicdb_example_hnsw_articles
ORDER BY embedding <-> ARRAY[0.10, 0.80, 0.05, 0.00]::real[]::vector
LIMIT 5;

COMMIT;

Settings

Setting Applies at Notes
indexing.hnsw.m Index build Higher values may increase memory use and build cost.
indexing.hnsw.ef_construction Index build Higher values may increase build time and change graph connectivity.
vectoron.hnsw_ef_search Query execution Higher values evaluate more candidates and may increase CPU work and latency.

Like other PostgreSQL settings, search settings can be changed for a session with SET or for a transaction with SET LOCAL.

When tuning vectoron.hnsw_ef_search, compare recall and latency before choosing a value.