From d2a67c637fdf2667906694864b201d3c06db6c7c Mon Sep 17 00:00:00 2001 From: Paul Masurel Date: Mon, 25 Jul 2016 17:01:34 +0900 Subject: [PATCH] Added unit test --- src/query/multi_term_query.rs | 30 ++++++++++++++------------- src/query/multi_term_scorer.rs | 38 ++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 14 deletions(-) diff --git a/src/query/multi_term_query.rs b/src/query/multi_term_query.rs index aa563b07c..99e455f8d 100644 --- a/src/query/multi_term_query.rs +++ b/src/query/multi_term_query.rs @@ -23,10 +23,7 @@ impl Query for MultiTermQuery { fn search(&self, searcher: &Searcher, collector: &mut C) -> io::Result { let mut timer_tree = TimerTree::new(); - let query_coord = iter::repeat(1f32).take(self.terms.len()).collect(); - let idf = iter::repeat(1f32).take(self.terms.len()).collect(); - let multi_term_scorer = MultiTermScorer::new(query_coord, idf); - + let multi_term_scorer = self.scorer(searcher); { let mut search_timer = timer_tree.open("search"); for (segment_ord, segment_reader) in searcher.segments().iter().enumerate() { @@ -43,7 +40,6 @@ impl Query for MultiTermQuery { let _collection_timer = segment_search_timer.open("collection"); while postings.next() { collector.collect(postings.doc(), postings.score()); - // collector.collect(postings.doc(), score); } } } @@ -54,14 +50,21 @@ impl Query for MultiTermQuery { impl MultiTermQuery { - // fn scorer(&self, searcher: &Searcher) -> MultiTermScorer { - // let doc_freqs: Vec = self.terms.iter() - // .map(|term| searcher.doc_freq(term)) - // .collect(); - // MultiTermScorer { - // search.doc_freq() - // } - // } + fn scorer(&self, searcher: &Searcher) -> MultiTermScorer { + let idfs: Vec = self.terms.iter() + .map(|term| searcher.doc_freq(term)) + .map(|doc_freq| { + if doc_freq == 0 { + return 1. + } + else { + 1.0 / (doc_freq as f32) + } + }) + .collect(); + let query_coord = iter::repeat(1f32).take(self.terms.len()).collect(); + MultiTermScorer::new(query_coord, idfs) + } pub fn new(terms: Vec) -> MultiTermQuery { MultiTermQuery { @@ -80,7 +83,6 @@ impl MultiTermQuery { segment_postings.push(postings); } None => { - // currently this is a strict intersection. segment_postings.push(SegmentPostings::empty()); } } diff --git a/src/query/multi_term_scorer.rs b/src/query/multi_term_scorer.rs index 9e14f7a49..b619087c1 100644 --- a/src/query/multi_term_scorer.rs +++ b/src/query/multi_term_scorer.rs @@ -41,3 +41,41 @@ impl Scorer for MultiTermScorer { self.score * self.coord() } } + + + +#[cfg(test)] +mod tests { + + use super::*; + use query::Scorer; + + #[test] + pub fn test_multiterm_scorer() { + let mut multi_term_scorer = MultiTermScorer::new(vec!(1f32, 2f32), vec!(1f32, 4f32)); + { + multi_term_scorer.update(0, 1); + assert_eq!(multi_term_scorer.score(), 1f32); + multi_term_scorer.clear(); + } + { + multi_term_scorer.update(1, 1); + assert_eq!(multi_term_scorer.score(), 4f32); + multi_term_scorer.clear(); + } + { + multi_term_scorer.update(0, 2); + assert_eq!(multi_term_scorer.score(), 2f32); + multi_term_scorer.clear(); + } + { + multi_term_scorer.update(0, 1); + multi_term_scorer.update(1, 1); + assert_eq!(multi_term_scorer.score(), 10f32); + multi_term_scorer.clear(); + } + + + } + +}