Skip to main content

Query

Trait Query 

Source
pub trait Query:
    Display
    + Send
    + Sync {
    // Required methods
    fn scorer<'a>(
        &self,
        reader: &'a SegmentReader,
        limit: usize,
    ) -> ScorerFuture<'a>;
    fn count_estimate<'a>(&self, reader: &'a SegmentReader) -> CountFuture<'a>;

    // Provided methods
    fn scorer_sync<'a>(
        &self,
        reader: &'a SegmentReader,
        limit: usize,
    ) -> Result<Box<dyn Scorer + 'a>> { ... }
    fn decompose(&self) -> QueryDecomposition { ... }
    fn is_filter(&self) -> bool { ... }
    fn as_doc_predicate<'a>(
        &self,
        _reader: &'a SegmentReader,
    ) -> Option<DocPredicate<'a>> { ... }
    fn as_doc_bitset(&self, _reader: &SegmentReader) -> Option<DocBitset> { ... }
    fn bitset_cardinality_estimate(
        &self,
        _reader: &SegmentReader,
    ) -> Option<u64> { ... }
}
Expand description

A search query (async)

Note: scorer takes &self (not &'a self) so that scorers don’t borrow the query. This enables query composition - queries can create sub-queries locally and get their scorers. Implementations must clone/capture any data they need during scorer creation.

Required Methods§

Source

fn scorer<'a>( &self, reader: &'a SegmentReader, limit: usize, ) -> ScorerFuture<'a>

Create a scorer for this query against a single segment (async)

The limit parameter specifies the maximum number of results to return. This is passed from the top-level search limit.

Note: The scorer borrows only the reader, not the query. Implementations should capture any needed query data (field, terms, etc.) during creation.

Source

fn count_estimate<'a>(&self, reader: &'a SegmentReader) -> CountFuture<'a>

Estimated number of matching documents in a segment (async)

Provided Methods§

Source

fn scorer_sync<'a>( &self, reader: &'a SegmentReader, limit: usize, ) -> Result<Box<dyn Scorer + 'a>>

Create a scorer synchronously (mmap/RAM only).

Available when the sync feature is enabled. Default implementation returns an error.

Source

fn decompose(&self) -> QueryDecomposition

Decompose this query for MaxScore optimization.

Returns TextTerm for simple term queries, SparseTerms for sparse vector queries (single or multi-dim), or Opaque if the query cannot be decomposed.

Source

fn is_filter(&self) -> bool

True if this query is a pure filter (always scores 1.0, no positions). Used by the planner to convert non-selective MUST filters into predicates.

Source

fn as_doc_predicate<'a>( &self, _reader: &'a SegmentReader, ) -> Option<DocPredicate<'a>>

For filter queries: return a cheap per-doc predicate against a segment. The predicate does O(1) work per doc (e.g., fast-field lookup).

Source

fn as_doc_bitset(&self, _reader: &SegmentReader) -> Option<DocBitset>

Build a compact bitset of matching doc_ids for this query.

Preferred over as_doc_predicate for BMP filtered queries because bitset lookup is ~2ns vs ~30-40ns for a fast-field closure. Default returns None; TermQuery overrides this to build from its posting list in O(M) time.

Source

fn bitset_cardinality_estimate(&self, _reader: &SegmentReader) -> Option<u64>

Cheap estimate of how many docs this filter clause matches in the segment. Used by the boolean planner to order MUST/MUST_NOT evaluation: the narrowest clause is materialized first and wider clauses refine it with per-doc probes instead of being fully materialized. None = unknown (treated as matching everything).

Trait Implementations§

Source§

impl Query for Box<dyn Query>

Source§

fn scorer<'a>( &self, reader: &'a SegmentReader, limit: usize, ) -> ScorerFuture<'a>

Create a scorer for this query against a single segment (async) Read more
Source§

fn count_estimate<'a>(&self, reader: &'a SegmentReader) -> CountFuture<'a>

Estimated number of matching documents in a segment (async)
Source§

fn decompose(&self) -> QueryDecomposition

Decompose this query for MaxScore optimization. Read more
Source§

fn is_filter(&self) -> bool

True if this query is a pure filter (always scores 1.0, no positions). Used by the planner to convert non-selective MUST filters into predicates.
Source§

fn as_doc_predicate<'a>( &self, reader: &'a SegmentReader, ) -> Option<DocPredicate<'a>>

For filter queries: return a cheap per-doc predicate against a segment. The predicate does O(1) work per doc (e.g., fast-field lookup).
Source§

fn as_doc_bitset(&self, reader: &SegmentReader) -> Option<DocBitset>

Build a compact bitset of matching doc_ids for this query. Read more
Source§

fn bitset_cardinality_estimate(&self, reader: &SegmentReader) -> Option<u64>

Cheap estimate of how many docs this filter clause matches in the segment. Used by the boolean planner to order MUST/MUST_NOT evaluation: the narrowest clause is materialized first and wider clauses refine it with per-doc probes instead of being fully materialized. None = unknown (treated as matching everything).
Source§

fn scorer_sync<'a>( &self, reader: &'a SegmentReader, limit: usize, ) -> Result<Box<dyn Scorer + 'a>>

Create a scorer synchronously (mmap/RAM only). Read more

Dyn Compatibility§

This trait is dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety".

Implementations on Foreign Types§

Source§

impl Query for Box<dyn Query>

Source§

fn scorer<'a>( &self, reader: &'a SegmentReader, limit: usize, ) -> ScorerFuture<'a>

Source§

fn count_estimate<'a>(&self, reader: &'a SegmentReader) -> CountFuture<'a>

Source§

fn decompose(&self) -> QueryDecomposition

Source§

fn is_filter(&self) -> bool

Source§

fn as_doc_predicate<'a>( &self, reader: &'a SegmentReader, ) -> Option<DocPredicate<'a>>

Source§

fn as_doc_bitset(&self, reader: &SegmentReader) -> Option<DocBitset>

Source§

fn bitset_cardinality_estimate(&self, reader: &SegmentReader) -> Option<u64>

Source§

fn scorer_sync<'a>( &self, reader: &'a SegmentReader, limit: usize, ) -> Result<Box<dyn Scorer + 'a>>

Implementors§