Struct tantivy::query::RangeQuery
source · pub struct RangeQuery { /* private fields */ }
Expand description
RangeQuery
matches all documents that have at least one term within a defined range.
Matched document will all get a constant Score
of one.
§Implementation
§Default
The default implementation collects all documents upfront into a BitSet
.
This is done by iterating over the terms within the range and loading all docs for each
TermInfo
from the inverted index (posting list) and put them into a BitSet
.
Depending on the number of terms matched, this is a potentially expensive operation.
§IP fast field
For IP fast fields a custom variant is used, by scanning the fast field. Unlike the default variant we can walk in a lazy fashion over it, since the fastfield is implicit orderered by DocId.
§Example
use tantivy::collector::Count;
use tantivy::query::RangeQuery;
use tantivy::schema::{Schema, INDEXED};
use tantivy::{doc, Index, IndexWriter};
let mut schema_builder = Schema::builder();
let year_field = schema_builder.add_u64_field("year", INDEXED);
let schema = schema_builder.build();
let index = Index::create_in_ram(schema);
let mut index_writer: IndexWriter = index.writer_with_num_threads(1, 20_000_000)?;
for year in 1950u64..2017u64 {
let num_docs_within_year = 10 + (year - 1950) * (year - 1950);
for _ in 0..num_docs_within_year {
index_writer.add_document(doc!(year_field => year))?;
}
}
index_writer.commit()?;
let reader = index.reader()?;
let searcher = reader.searcher();
let docs_in_the_sixties = RangeQuery::new_u64("year".to_string(), 1960..1970);
let num_60s_books = searcher.search(&docs_in_the_sixties, &Count)?;
assert_eq!(num_60s_books, 2285);
Ok(())
Implementations§
source§impl RangeQuery
impl RangeQuery
sourcepub fn new_term_bounds(
field: String,
value_type: Type,
lower_bound: &Bound<Term>,
upper_bound: &Bound<Term>
) -> RangeQuery
pub fn new_term_bounds( field: String, value_type: Type, lower_bound: &Bound<Term>, upper_bound: &Bound<Term> ) -> RangeQuery
Creates a new RangeQuery
from bounded start and end terms.
If the value type is not correct, something may go terribly wrong when
the Weight
object is created.
sourcepub fn new_i64(field: String, range: Range<i64>) -> RangeQuery
pub fn new_i64(field: String, range: Range<i64>) -> RangeQuery
Creates a new RangeQuery
over a i64
field.
If the field is not of the type i64
, tantivy
will panic when the Weight
object is created.
sourcepub fn new_i64_bounds(
field: String,
lower_bound: Bound<i64>,
upper_bound: Bound<i64>
) -> RangeQuery
pub fn new_i64_bounds( field: String, lower_bound: Bound<i64>, upper_bound: Bound<i64> ) -> RangeQuery
Create a new RangeQuery
over a i64
field.
The two Bound
arguments make it possible to create more complex
ranges than semi-inclusive range.
If the field is not of the type i64
, tantivy
will panic when the Weight
object is created.
sourcepub fn new_f64(field: String, range: Range<f64>) -> RangeQuery
pub fn new_f64(field: String, range: Range<f64>) -> RangeQuery
Creates a new RangeQuery
over a f64
field.
If the field is not of the type f64
, tantivy
will panic when the Weight
object is created.
sourcepub fn new_f64_bounds(
field: String,
lower_bound: Bound<f64>,
upper_bound: Bound<f64>
) -> RangeQuery
pub fn new_f64_bounds( field: String, lower_bound: Bound<f64>, upper_bound: Bound<f64> ) -> RangeQuery
Create a new RangeQuery
over a f64
field.
The two Bound
arguments make it possible to create more complex
ranges than semi-inclusive range.
If the field is not of the type f64
, tantivy
will panic when the Weight
object is created.
sourcepub fn new_u64_bounds(
field: String,
lower_bound: Bound<u64>,
upper_bound: Bound<u64>
) -> RangeQuery
pub fn new_u64_bounds( field: String, lower_bound: Bound<u64>, upper_bound: Bound<u64> ) -> RangeQuery
Create a new RangeQuery
over a u64
field.
The two Bound
arguments make it possible to create more complex
ranges than semi-inclusive range.
If the field is not of the type u64
, tantivy
will panic when the Weight
object is created.
sourcepub fn new_ip_bounds(
field: String,
lower_bound: Bound<Ipv6Addr>,
upper_bound: Bound<Ipv6Addr>
) -> RangeQuery
pub fn new_ip_bounds( field: String, lower_bound: Bound<Ipv6Addr>, upper_bound: Bound<Ipv6Addr> ) -> RangeQuery
Create a new RangeQuery
over a ip
field.
If the field is not of the type ip
, tantivy
will panic when the Weight
object is created.
sourcepub fn new_u64(field: String, range: Range<u64>) -> RangeQuery
pub fn new_u64(field: String, range: Range<u64>) -> RangeQuery
Create a new RangeQuery
over a u64
field.
If the field is not of the type u64
, tantivy
will panic when the Weight
object is created.
sourcepub fn new_date_bounds(
field: String,
lower_bound: Bound<DateTime>,
upper_bound: Bound<DateTime>
) -> RangeQuery
pub fn new_date_bounds( field: String, lower_bound: Bound<DateTime>, upper_bound: Bound<DateTime> ) -> RangeQuery
Create a new RangeQuery
over a date
field.
The two Bound
arguments make it possible to create more complex
ranges than semi-inclusive range.
If the field is not of the type date
, tantivy
will panic when the Weight
object is created.
sourcepub fn new_date(field: String, range: Range<DateTime>) -> RangeQuery
pub fn new_date(field: String, range: Range<DateTime>) -> RangeQuery
Create a new RangeQuery
over a date
field.
If the field is not of the type date
, tantivy
will panic when the Weight
object is created.
sourcepub fn new_str_bounds(
field: String,
lower_bound: Bound<&str>,
upper_bound: Bound<&str>
) -> RangeQuery
pub fn new_str_bounds( field: String, lower_bound: Bound<&str>, upper_bound: Bound<&str> ) -> RangeQuery
Create a new RangeQuery
over a Str
field.
The two Bound
arguments make it possible to create more complex
ranges than semi-inclusive range.
If the field is not of the type Str
, tantivy
will panic when the Weight
object is created.
Trait Implementations§
source§impl Clone for RangeQuery
impl Clone for RangeQuery
source§fn clone(&self) -> RangeQuery
fn clone(&self) -> RangeQuery
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moresource§impl Debug for RangeQuery
impl Debug for RangeQuery
source§impl Query for RangeQuery
impl Query for RangeQuery
source§fn weight(&self, enable_scoring: EnableScoring<'_>) -> Result<Box<dyn Weight>>
fn weight(&self, enable_scoring: EnableScoring<'_>) -> Result<Box<dyn Weight>>
source§fn explain(
&self,
searcher: &Searcher,
doc_address: DocAddress
) -> Result<Explanation>
fn explain( &self, searcher: &Searcher, doc_address: DocAddress ) -> Result<Explanation>
Explanation
for the score of the document.Auto Trait Implementations§
impl Freeze for RangeQuery
impl RefUnwindSafe for RangeQuery
impl Send for RangeQuery
impl Sync for RangeQuery
impl Unpin for RangeQuery
impl UnwindSafe for RangeQuery
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.