Package org.apache.lucene.util.hnsw
Class HnswGraph
- java.lang.Object
-
- org.apache.lucene.util.hnsw.HnswGraph
-
- Direct Known Subclasses:
OnHeapHnswGraph
public abstract class HnswGraph extends Object
Hierarchical Navigable Small World graph. Provides efficient approximate nearest neighbor search for high dimensional vectors. See Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs [2018] paper for details.The nomenclature is a bit different here from what's used in the paper:
Hyperparameters
beamWidthinHnswGraphBuilderhas the same meaning asefConstin the paper. It is the number of nearest neighbor candidates to track while searching the graph for each newly inserted node.maxConnhas the same meaning asMin the paper; it controls how many of theefConstneighbors are connected to the new node
Note: The graph may be searched by multiple threads concurrently, but updates are not thread-safe. The search method optionally takes a set of "accepted nodes", which can be used to exclude deleted documents.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static classHnswGraph.ArrayNodesIteratorNodesIterator that accepts nodes as an integer array.static classHnswGraph.CollectionNodesIteratorNodes iterator based on set representation of nodes.static classHnswGraph.NodesIteratorIterator over the graph nodes on a certain level, Iterator also provides the size – the total number of nodes to be iterated over.
-
Constructor Summary
Constructors Modifier Constructor Description protectedHnswGraph()Sole constructor
-
Method Summary
All Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description abstract intentryNode()Returns graph's entry point on the top level *abstract HnswGraph.NodesIteratorgetNodesOnLevel(int level)Get all nodes on a given level as node 0th ordinalsintmaxNodeId()Returns max node id, inclusive, normally this value will be size - 1abstract intnextNeighbor()Iterates over the neighbor list.abstract intnumLevels()Returns the number of levels of the graphabstract voidseek(int level, int target)Move the pointer to exactly the givenlevel'starget.abstract intsize()Returns the number of nodes in the graph
-
-
-
Field Detail
-
EMPTY
public static HnswGraph EMPTY
Empty graph value
-
-
Method Detail
-
seek
public abstract void seek(int level, int target) throws IOExceptionMove the pointer to exactly the givenlevel'starget. After this method returns, callnextNeighbor()to return successive (ordered) connected node ordinals.- Parameters:
level- level of the graphtarget- ordinal of a node in the graph, must be ≥ 0 and <FloatVectorValues.size().- Throws:
IOException
-
size
public abstract int size()
Returns the number of nodes in the graph
-
maxNodeId
public int maxNodeId()
Returns max node id, inclusive, normally this value will be size - 1
-
nextNeighbor
public abstract int nextNeighbor() throws IOExceptionIterates over the neighbor list. It is illegal to call this method after it returns NO_MORE_DOCS without callingseek(int, int), which resets the iterator.- Returns:
- a node ordinal in the graph, or NO_MORE_DOCS if the iteration is complete.
- Throws:
IOException
-
numLevels
public abstract int numLevels() throws IOExceptionReturns the number of levels of the graph- Throws:
IOException
-
entryNode
public abstract int entryNode() throws IOExceptionReturns graph's entry point on the top level *- Throws:
IOException
-
getNodesOnLevel
public abstract HnswGraph.NodesIterator getNodesOnLevel(int level) throws IOException
Get all nodes on a given level as node 0th ordinals- Parameters:
level- level for which to get all nodes- Returns:
- an iterator over nodes where
nextIntreturns a next node on the level - Throws:
IOException
-
-