Struct tantivy::collector::FilterCollector
source · pub struct FilterCollector<TCollector, TPredicate, TPredicateValue>where
TPredicate: 'static + Clone,{ /* private fields */ }
Expand description
The FilterCollector
filters docs using a fast field value and a predicate.
Only the documents containing at least one value for which the predicate returns true
will be passed on to the next collector.
In other words,
- documents with no values are filtered out.
- documents with several values are accepted if at least one value matches the predicate.
use tantivy::collector::{TopDocs, FilterCollector};
use tantivy::query::QueryParser;
use tantivy::schema::{Schema, TEXT, FAST};
use tantivy::{doc, DocAddress, Index};
let mut schema_builder = Schema::builder();
let title = schema_builder.add_text_field("title", TEXT);
let price = schema_builder.add_u64_field("price", FAST);
let schema = schema_builder.build();
let index = Index::create_in_ram(schema);
let mut index_writer = index.writer_with_num_threads(1, 20_000_000)?;
index_writer.add_document(doc!(title => "The Name of the Wind", price => 30_200u64))?;
index_writer.add_document(doc!(title => "The Diary of Muadib", price => 29_240u64))?;
index_writer.add_document(doc!(title => "A Dairy Cow", price => 21_240u64))?;
index_writer.add_document(doc!(title => "The Diary of a Young Girl", price => 20_120u64))?;
index_writer.commit()?;
let reader = index.reader()?;
let searcher = reader.searcher();
let query_parser = QueryParser::for_index(&index, vec![title]);
let query = query_parser.parse_query("diary")?;
let no_filter_collector = FilterCollector::new("price".to_string(), |value: u64| value > 20_120u64, TopDocs::with_limit(2));
let top_docs = searcher.search(&query, &no_filter_collector)?;
assert_eq!(top_docs.len(), 1);
assert_eq!(top_docs[0].1, DocAddress::new(0, 1));
let filter_all_collector: FilterCollector<_, _, u64> = FilterCollector::new("price".to_string(), |value| value < 5u64, TopDocs::with_limit(2));
let filtered_top_docs = searcher.search(&query, &filter_all_collector)?;
assert_eq!(filtered_top_docs.len(), 0);
Note that this is limited to fast fields which implement the
FastValue
trait, e.g. u64
but not &[u8]
.
To filter based on a bytes fast field, use a BytesFilterCollector
instead.
Implementations§
source§impl<TCollector, TPredicate, TPredicateValue> FilterCollector<TCollector, TPredicate, TPredicateValue>
impl<TCollector, TPredicate, TPredicateValue> FilterCollector<TCollector, TPredicate, TPredicateValue>
Trait Implementations§
source§impl<TCollector, TPredicate, TPredicateValue> Collector for FilterCollector<TCollector, TPredicate, TPredicateValue>
impl<TCollector, TPredicate, TPredicateValue> Collector for FilterCollector<TCollector, TPredicate, TPredicateValue>
§type Fruit = <TCollector as Collector>::Fruit
type Fruit = <TCollector as Collector>::Fruit
Fruit
is the type for the result of our collection.
e.g. usize
for the Count
collector.§type Child = FilterSegmentCollector<<TCollector as Collector>::Child, TPredicate, TPredicateValue>
type Child = FilterSegmentCollector<<TCollector as Collector>::Child, TPredicate, TPredicateValue>
Type of the
SegmentCollector
associated with this collector.source§fn for_segment(
&self,
segment_local_id: u32,
segment_reader: &SegmentReader
) -> Result<Self::Child>
fn for_segment( &self, segment_local_id: u32, segment_reader: &SegmentReader ) -> Result<Self::Child>
set_segment
is called before beginning to enumerate
on this segment.source§fn requires_scoring(&self) -> bool
fn requires_scoring(&self) -> bool
Returns true iff the collector requires to compute scores for documents.
source§fn merge_fruits(
&self,
segment_fruits: Vec<<TCollector::Child as SegmentCollector>::Fruit>
) -> Result<TCollector::Fruit>
fn merge_fruits( &self, segment_fruits: Vec<<TCollector::Child as SegmentCollector>::Fruit> ) -> Result<TCollector::Fruit>
Combines the fruit associated with the collection of each segments
into one fruit.
source§fn collect_segment(
&self,
weight: &dyn Weight,
segment_ord: u32,
reader: &SegmentReader
) -> Result<<Self::Child as SegmentCollector>::Fruit>
fn collect_segment( &self, weight: &dyn Weight, segment_ord: u32, reader: &SegmentReader ) -> Result<<Self::Child as SegmentCollector>::Fruit>
Created a segment collector and
Auto Trait Implementations§
impl<TCollector, TPredicate, TPredicateValue> Freeze for FilterCollector<TCollector, TPredicate, TPredicateValue>
impl<TCollector, TPredicate, TPredicateValue> RefUnwindSafe for FilterCollector<TCollector, TPredicate, TPredicateValue>
impl<TCollector, TPredicate, TPredicateValue> Send for FilterCollector<TCollector, TPredicate, TPredicateValue>
impl<TCollector, TPredicate, TPredicateValue> Sync for FilterCollector<TCollector, TPredicate, TPredicateValue>
impl<TCollector, TPredicate, TPredicateValue> Unpin for FilterCollector<TCollector, TPredicate, TPredicateValue>
impl<TCollector, TPredicate, TPredicateValue> UnwindSafe for FilterCollector<TCollector, TPredicate, TPredicateValue>
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
Mutably borrows from an owned value. Read more
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>
Convert
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>
Convert
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)
Convert
&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)
Convert
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.