Class AbstractKnnVectorQuery

java.lang.Object
org.apache.lucene.search.Query
org.apache.lucene.search.AbstractKnnVectorQuery
Direct Known Subclasses:
KnnByteVectorQuery, KnnFloatVectorQuery

abstract class AbstractKnnVectorQuery extends Query
Uses KnnVectorsReader.search(java.lang.String, float[], int, org.apache.lucene.util.Bits, int) to perform nearest neighbour search.

This query also allows for performing a kNN search subject to a filter. In this case, it first executes the filter for each leaf, then chooses a strategy dynamically:

  • If the filter cost is less than k, just execute an exact search
  • Otherwise run a kNN search subject to the filter
  • If the kNN search visits too many vectors without completing, stop and run an exact search
  • Field Details

    • NO_RESULTS

      private static final TopDocs NO_RESULTS
    • field

      protected final String field
    • k

      protected final int k
    • filter

      private final Query filter
  • Constructor Details

    • AbstractKnnVectorQuery

      public AbstractKnnVectorQuery(String field, int k, Query filter)
  • Method Details

    • rewrite

      public Query rewrite(IndexReader reader) throws IOException
      Description copied from class: Query
      Expert: called to re-write queries into primitive queries. For example, a PrefixQuery will be rewritten into a BooleanQuery that consists of TermQuerys.

      Callers are expected to call rewrite multiple times if necessary, until the rewritten query is the same as the original query.

      Overrides:
      rewrite in class Query
      Throws:
      IOException
      See Also:
    • searchLeaf

      private TopDocs searchLeaf(LeafReaderContext ctx, Weight filterWeight) throws IOException
      Throws:
      IOException
    • createBitSet

      private BitSet createBitSet(DocIdSetIterator iterator, Bits liveDocs, int maxDoc) throws IOException
      Throws:
      IOException
    • approximateSearch

      protected abstract TopDocs approximateSearch(LeafReaderContext context, Bits acceptDocs, int visitedLimit) throws IOException
      Throws:
      IOException
    • createVectorScorer

      abstract VectorScorer createVectorScorer(LeafReaderContext context, FieldInfo fi) throws IOException
      Throws:
      IOException
    • exactSearch

      protected TopDocs exactSearch(LeafReaderContext context, DocIdSetIterator acceptIterator) throws IOException
      Throws:
      IOException
    • createRewrittenQuery

      private Query createRewrittenQuery(IndexReader reader, TopDocs topK)
    • findSegmentStarts

      private int[] findSegmentStarts(IndexReader reader, int[] docs)
    • visit

      public void visit(QueryVisitor visitor)
      Description copied from class: Query
      Recurse through the query tree, visiting any child queries
      Specified by:
      visit in class Query
      Parameters:
      visitor - a QueryVisitor to be called by each query in the tree
    • equals

      public boolean equals(Object o)
      Description copied from class: Query
      Override and implement query instance equivalence properly in a subclass. This is required so that QueryCache works properly.

      Typically a query will be equal to another only if it's an instance of the same class and its document-filtering properties are identical that other instance. Utility methods are provided for certain repetitive code.

      Specified by:
      equals in class Query
      See Also:
    • hashCode

      public int hashCode()
      Description copied from class: Query
      Override and implement query hash code properly in a subclass. This is required so that QueryCache works properly.
      Specified by:
      hashCode in class Query
      See Also:
    • getField

      public String getField()
      Returns:
      the knn vector field where the knn vector search happens.
    • getK

      public int getK()
      Returns:
      the max number of results the KnnVector search returns.
    • getFilter

      public Query getFilter()
      Returns:
      the filter that is executed before the KnnVector search happens. Only the results accepted by this filter are returned by the KnnVector search.