[−][src]Struct tantivy::query::BooleanQuery
The boolean query returns a set of documents that matches the Boolean combination of constituent subqueries.
The documents matched by the boolean query are those which
- match all of the sub queries associated with the
Must
occurence - match none of the sub queries associated with the
MustNot
occurence. - match at least one of the subqueries that is not
a
MustNot
occurence.
You can combine other query types and their Occur
ances into one BooleanQuery
use tantivy::collector::Count; use tantivy::doc; use tantivy::query::{BooleanQuery, Occur, PhraseQuery, Query, TermQuery}; use tantivy::schema::{IndexRecordOption, Schema, TEXT}; use tantivy::Term; use tantivy::{Index, Result}; fn main() -> Result<()> { let mut schema_builder = Schema::builder(); let title = schema_builder.add_text_field("title", TEXT); let body = schema_builder.add_text_field("body", TEXT); let schema = schema_builder.build(); let index = Index::create_in_ram(schema); { let mut index_writer = index.writer(3_000_000)?; index_writer.add_document(doc!( title => "The Name of the Wind", )); index_writer.add_document(doc!( title => "The Diary of Muadib", )); index_writer.add_document(doc!( title => "A Dairy Cow", body => "hidden", )); index_writer.add_document(doc!( title => "A Dairy Cow", body => "found", )); index_writer.add_document(doc!( title => "The Diary of a Young Girl", )); index_writer.commit().unwrap(); } let reader = index.reader()?; let searcher = reader.searcher(); // Make TermQuery's for "girl" and "diary" in the title let girl_term_query: Box<dyn Query> = Box::new(TermQuery::new( Term::from_field_text(title, "girl"), IndexRecordOption::Basic, )); let diary_term_query: Box<dyn Query> = Box::new(TermQuery::new( Term::from_field_text(title, "diary"), IndexRecordOption::Basic, )); // A TermQuery with "found" in the body let body_term_query: Box<dyn Query> = Box::new(TermQuery::new( Term::from_field_text(body, "found"), IndexRecordOption::Basic, )); // TermQuery "diary" must and "girl" must not be present let queries_with_occurs1 = vec![ (Occur::Must, diary_term_query.box_clone()), (Occur::MustNot, girl_term_query), ]; // Make a BooleanQuery equivalent to // title:+diary title:-girl let diary_must_and_girl_mustnot = BooleanQuery::from(queries_with_occurs1); let count1 = searcher.search(&diary_must_and_girl_mustnot, &Count)?; assert_eq!(count1, 1); // TermQuery for "cow" in the title let cow_term_query: Box<dyn Query> = Box::new(TermQuery::new( Term::from_field_text(title, "cow"), IndexRecordOption::Basic, )); // "title:diary OR title:cow" let title_diary_or_cow = BooleanQuery::from(vec![ (Occur::Should, diary_term_query.box_clone()), (Occur::Should, cow_term_query), ]); let count2 = searcher.search(&title_diary_or_cow, &Count)?; assert_eq!(count2, 4); // Make a `PhraseQuery` from a vector of `Term`s let phrase_query: Box<dyn Query> = Box::new(PhraseQuery::new(vec![ Term::from_field_text(title, "dairy"), Term::from_field_text(title, "cow"), ])); // You can combine subqueries of different types into 1 BooleanQuery: // `TermQuery` and `PhraseQuery` // "title:diary OR "dairy cow" let term_of_phrase_query = BooleanQuery::from(vec![ (Occur::Should, diary_term_query.box_clone()), (Occur::Should, phrase_query.box_clone()), ]); let count3 = searcher.search(&term_of_phrase_query, &Count)?; assert_eq!(count3, 4); // You can nest one BooleanQuery inside another // body:found AND ("title:diary OR "dairy cow") let nested_query = BooleanQuery::from(vec![ (Occur::Must, body_term_query), (Occur::Must, Box::new(term_of_phrase_query)) ]); let count4 = searcher.search(&nested_query, &Count)?; assert_eq!(count4, 1); Ok(()) }
Methods
impl BooleanQuery
[src]
pub fn new_multiterms_query(terms: Vec<Term>) -> BooleanQuery
[src]
Helper method to create a boolean query matching a given list of terms. The resulting query is a disjunction of the terms.
pub fn clauses(&self) -> &[(Occur, Box<dyn Query>)]
[src]
Deconstructed view of the clauses making up this query.
Trait Implementations
impl Clone for BooleanQuery
[src]
fn clone(&self) -> Self
[src]
fn clone_from(&mut self, source: &Self)
1.0.0[src]
impl Debug for BooleanQuery
[src]
impl From<Vec<(Occur, Box<dyn Query + 'static>)>> for BooleanQuery
[src]
impl Query for BooleanQuery
[src]
fn weight(
&self,
searcher: &Searcher,
scoring_enabled: bool
) -> Result<Box<dyn Weight>>
[src]
&self,
searcher: &Searcher,
scoring_enabled: bool
) -> Result<Box<dyn Weight>>
fn query_terms(&self, term_set: &mut BTreeSet<Term>)
[src]
fn explain(
&self,
searcher: &Searcher,
doc_address: DocAddress
) -> Result<Explanation>
[src]
&self,
searcher: &Searcher,
doc_address: DocAddress
) -> Result<Explanation>
fn count(&self, searcher: &Searcher) -> Result<usize>
[src]
Auto Trait Implementations
impl !RefUnwindSafe for BooleanQuery
impl !Send for BooleanQuery
impl !Sync for BooleanQuery
impl Unpin for BooleanQuery
impl !UnwindSafe for BooleanQuery
Blanket Implementations
impl<T> Any for T where
T: 'static + ?Sized,
[src]
T: 'static + ?Sized,
impl<T> Borrow<T> for T where
T: ?Sized,
[src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
[src]
T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
[src]
impl<T> Downcast for T where
T: Any,
[src]
T: Any,
fn into_any(self: Box<T>) -> Box<dyn Any + 'static>
[src]
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any + 'static>
[src]
fn as_any(&self) -> &(dyn Any + 'static)
[src]
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
[src]
impl<T> Erased for T
[src]
impl<T> From<T> for T
[src]
impl<T, U> Into<U> for T where
U: From<T>,
[src]
U: From<T>,
impl<T> ToOwned for T where
T: Clone,
[src]
T: Clone,
type Owned = T
The resulting type after obtaining ownership.
fn to_owned(&self) -> T
[src]
fn clone_into(&self, target: &mut T)
[src]
impl<T, U> TryFrom<U> for T where
U: Into<T>,
[src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>,
[src]
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error
The type returned in the event of a conversion error.
fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>
[src]
impl<V, T> VZip<V> for T where
V: MultiLane<T>,
V: MultiLane<T>,