benwtrent commented on code in PR #13635:
URL: https://github.com/apache/lucene/pull/13635#discussion_r1755241203


##########
lucene/core/src/java/org/apache/lucene/util/hnsw/HnswGraphSearcher.java:
##########
@@ -70,6 +72,44 @@ public static void search(
     search(scorer, knnCollector, graph, graphSearcher, acceptOrds);
   }
 
+  /**
+   * Searches the HNSW graph for for the nerest neighbors of a query vector, 
starting from the
+   * provided entry points.
+   *
+   * @param scorer the scorer to compare the query with the nodes
+   * @param knnCollector a collector of top knn results to be returned
+   * @param graph the graph values. May represent the entire graph, or a level 
in a hierarchical
+   *     graph.
+   * @param acceptOrds {@link Bits} that represents the allowed document 
ordinals to match, or
+   *     {@code null} if they are all allowed to match.
+   * @param entryPointOrds the entry points for search.
+   */
+  public static void search(
+      RandomVectorScorer scorer,
+      KnnCollector knnCollector,
+      HnswGraph graph,
+      Bits acceptOrds,
+      DocIdSetIterator entryPointOrds)
+      throws IOException {
+    ArrayList<Integer> entryPointOrdInts = null;
+    if (entryPointOrds != null) {
+      entryPointOrdInts = new ArrayList<Integer>();
+      int entryPointOrdInt;
+      while ((entryPointOrdInt = entryPointOrds.nextDoc()) != NO_MORE_DOCS) {
+        entryPointOrdInts.add(entryPointOrdInt);
+      }
+    }
+    if (entryPointOrdInts == null || entryPointOrdInts.isEmpty()) {
+      search(scorer, knnCollector, graph, acceptOrds);
+    } else {
+      HnswGraphSearcher graphSearcher =
+          new HnswGraphSearcher(
+              new NeighborQueue(knnCollector.k(), true), new 
SparseFixedBitSet(graph.size()));
+      int[] entryPointOrdIntsArr = 
entryPointOrdInts.stream().mapToInt(Integer::intValue).toArray();
+      graphSearcher.searchLevel(knnCollector, scorer, 0, entryPointOrdIntsArr, 
graph, acceptOrds);

Review Comment:
   Node ordinals are the same no matter the layer. Meaning `ord: 42` refers to 
vector `42` no matter what layer its on.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscr...@lucene.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscr...@lucene.apache.org
For additional commands, e-mail: issues-h...@lucene.apache.org

Reply via email to