diff --git a/bitpacker/src/blocked_bitpacker.rs b/bitpacker/src/blocked_bitpacker.rs index 3d901f7e9..3b372229d 100644 --- a/bitpacker/src/blocked_bitpacker.rs +++ b/bitpacker/src/blocked_bitpacker.rs @@ -64,10 +64,8 @@ fn mem_usage(items: &Vec) -> usize { impl BlockedBitpacker { pub fn new() -> Self { - let mut compressed_blocks = vec![]; - compressed_blocks.resize(8, 0); Self { - compressed_blocks, + compressed_blocks: vec![0; 8], buffer: vec![], offset_and_bits: vec![], } diff --git a/examples/basic_search.rs b/examples/basic_search.rs index 44b4eec34..af3652a49 100644 --- a/examples/basic_search.rs +++ b/examples/basic_search.rs @@ -221,5 +221,19 @@ fn main() -> tantivy::Result<()> { println!("{}", schema.to_json(&retrieved_doc)); } + // We can also get an explanation to understand + // how a found document got its score. + let query = query_parser.parse_query("title:sea^20 body:whale^70")?; + + let (_score, doc_address) = searcher + .search(&query, &TopDocs::with_limit(1))? + .into_iter() + .next() + .unwrap(); + + let explanation = query.explain(&searcher, doc_address)?; + + println!("{}", explanation.to_pretty_json()); + Ok(()) } diff --git a/query-grammar/src/query_grammar.rs b/query-grammar/src/query_grammar.rs index 6545be01b..ec1122124 100644 --- a/query-grammar/src/query_grammar.rs +++ b/query-grammar/src/query_grammar.rs @@ -1,3 +1,5 @@ +use std::iter::once; + use nom::branch::alt; use nom::bytes::complete::tag; use nom::character::complete::{ @@ -35,11 +37,7 @@ fn field_name(i: &str) -> IResult<&str, String> { )), char(':'), ), - |(first_char, next)| { - std::iter::once(first_char) - .chain(next.into_iter()) - .collect() - }, + |(first_char, next)| once(first_char).chain(next).collect(), )(i) } @@ -822,8 +820,7 @@ fn aggregate_infallible_expressions( if let Some(last) = clauses.last_mut() { last.push((occur.or(Some(Occur::Must)), ast.clone())); } else { - let mut last = Vec::new(); - last.push((occur.or(Some(Occur::Must)), ast.clone())); + let last = vec![(occur.or(Some(Occur::Must)), ast.clone())]; clauses.push(last); } } @@ -852,8 +849,7 @@ fn aggregate_infallible_expressions( if let Some(last) = clauses.last_mut() { last.push((last_occur.or(Some(Occur::Must)), last_ast)); } else { - let mut last = Vec::new(); - last.push((last_occur.or(Some(Occur::Must)), last_ast)); + let last = vec![(last_occur.or(Some(Occur::Must)), last_ast)]; clauses.push(last); } } diff --git a/src/core/json_utils.rs b/src/core/json_utils.rs index 25dff1dde..e7c85d1ab 100644 --- a/src/core/json_utils.rs +++ b/src/core/json_utils.rs @@ -60,7 +60,7 @@ impl IndexingPositionsPerPath { fn get_position(&mut self, term: &Term) -> &mut IndexingPosition { self.positions_per_path .entry(murmurhash2(term.serialized_term())) - .or_insert_with(Default::default) + .or_default() } } diff --git a/src/query/boolean_query/boolean_weight.rs b/src/query/boolean_query/boolean_weight.rs index a2a407664..4979ab1f0 100644 --- a/src/query/boolean_query/boolean_weight.rs +++ b/src/query/boolean_query/boolean_weight.rs @@ -98,7 +98,7 @@ impl BooleanWeight { let sub_scorer: Box = subweight.scorer(reader, boost)?; per_occur_scorers .entry(*occur) - .or_insert_with(Vec::new) + .or_default() .push(sub_scorer); } Ok(per_occur_scorers) @@ -193,7 +193,7 @@ impl Weight for BooleanWeight crate::Result { - let mut scorer = self.scorer(reader, 1.0)?; - if scorer.seek(doc) != doc { - return Err(does_not_match(doc)); - } - let mut explanation = - Explanation::new(format!("Boost x{} of ...", self.boost), scorer.score()); let underlying_explanation = self.weight.explain(reader, doc)?; + let score = underlying_explanation.value() * self.boost; + let mut explanation = Explanation::new(format!("Boost x{} of ...", self.boost), score); explanation.add_detail(underlying_explanation); Ok(explanation) }