Skip to content

@saehrimnir/druidjs / HNSW

Class: HNSW<T>

Defined in: knn/HNSW.js:61

Hierarchical Navigable Small World (HNSW) graph for approximate nearest neighbor search.

HNSW builds a multi-layer graph structure where each layer is a navigable small world graph. The top layers serve as "highways" for fast traversal, while lower layers provide accuracy. Each element is assigned to a random level, allowing logarithmic search complexity.

Key parameters:

  • m: Controls the number of connections per element (affects accuracy/memory)
  • ef_construction: Controls the quality of the graph during construction (higher = better but slower)
  • ef: Controls the quality of search (higher = better recall but slower)

Based on:

  • "Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs" by Malkov & Yashunin (2016)
  • "Approximate Nearest Neighbor Search on High Dimensional Data" by Li et al. (2019)

Template

Example

ts
import * as druid from "@saehrimnir/druidjs";

const points = [[1, 2], [3, 4], [5, 6], [7, 8]];
const hnsw = new druid.HNSW(points, {
    metric: druid.euclidean,
    m: 16,
    ef_construction: 200
});

const query = [2, 3];
const neighbors = hnsw.search(query, 2);
// [{ element: [1, 2], index: 0, distance: 1.41 }, ...]

Extends

  • KNN

Type Parameters

Type ParameterDescription
T extends number[] | Float64Array

Constructors

Constructor

ts
new HNSW<T>(points: T[], parameters?: ParametersHNSW): HNSW<T>;

Defined in: knn/HNSW.js:68

Creates a new HNSW index.

Parameters

ParameterTypeDescription
pointsT[]Initial points to add to the index
parameters?ParametersHNSWConfiguration parameters

Returns

HNSW<T>

Overrides

ts
KNN.constructor

Properties

PropertyTypeInherited fromDefined in
_efnumber-knn/HNSW.js:142
_ef_constructionnumber-knn/HNSW.js:135
_elementsT[]KNN._elementsknn/KNN.js:14
_epnumber[] | null-knn/HNSW.js:161
_Lnumber-knn/HNSW.js:158
_mnumber-knn/HNSW.js:128
_m0number-knn/HNSW.js:149
_metricMetric-knn/HNSW.js:108
_mLnumber-knn/HNSW.js:152
_next_indexnumber-knn/HNSW.js:120
_parametersParametersHNSWKNN._parametersknn/KNN.js:16
_randomizerRandomizer-knn/HNSW.js:155
_selectFunction-knn/HNSW.js:111
_type"array" | "typed"KNN._typeknn/KNN.js:18

Accessors

num_layers

Get Signature

ts
get num_layers(): number;

Defined in: knn/HNSW.js:710

Get the number of layers in the graph.

Returns

number

Number of layers


size

Get Signature

ts
get size(): number;

Defined in: knn/HNSW.js:701

Get the number of elements in the index.

Returns

number

Number of elements

Methods

add()

ts
add(new_elements: T[]): HNSW<T>;

Defined in: knn/HNSW.js:185

Add multiple elements to the index.

Parameters

ParameterTypeDescription
new_elementsT[]Elements to add

Returns

HNSW<T>

This instance for chaining


addOne()

ts
addOne(element: T): HNSW<T>;

Defined in: knn/HNSW.js:175

Add a single element to the index.

Parameters

ParameterTypeDescription
elementTElement to add

Returns

HNSW<T>

This instance for chaining


get_element()

ts
get_element(index: number): T;

Defined in: knn/HNSW.js:720

Get an element by its index.

Parameters

ParameterTypeDescription
indexnumberElement index

Returns

T

The element at the given index


ts
search(q: T, K: number): Candidate<T>[];

Defined in: knn/HNSW.js:578

Searches for the K nearest neighbors to a query element in the HNSW graph.

Performs a multi-layer search starting from the entry point and traversing each layer as entry points for the next.

Parameters

ParameterTypeDescription
qTQuery element
KnumberNumber of nearest neighbors to return

Returns

Candidate<T>[]

K nearest neighbors with their distances

Overrides

ts
KNN.search

search_by_index()

ts
search_by_index(i: number, K?: number): Candidate<T>[];

Defined in: knn/HNSW.js:731

Search for nearest neighbors using an element index as the query.

Parameters

ParameterTypeDefault valueDescription
inumberundefinedIndex of the query element
K?number5Number of nearest neighbors to return

Returns

Candidate<T>[]

K nearest neighbors

Overrides

ts
KNN.search_by_index

search_iter()

ts
search_iter(
   q: T, 
   K: number, 
   ef?: number | null): Generator<{
  candidates: {
     distance: number;
     element: T;
     index: number;
  }[];
  layer: number;
}, void, unknown>;

Defined in: knn/HNSW.js:660

Iterator for searching the HNSW graph layer by layer.

Yields intermediate results at each layer for debugging or visualization.

Parameters

ParameterTypeDefault valueDescription
qTundefinedQuery element
KnumberundefinedNumber of nearest neighbors to return
ef?number | nullnullSize of dynamic candidate list

Returns

Generator<{ candidates: { distance: number; element: T; index: number; }[]; layer: number; }, void, unknown>

Yields