Added unit test

This commit is contained in:
Paul Masurel
2016-07-25 17:01:34 +09:00
parent 1080fe19dc
commit d2a67c637f
2 changed files with 54 additions and 14 deletions

View File

@@ -23,10 +23,7 @@ impl Query for MultiTermQuery {
fn search<C: Collector>(&self, searcher: &Searcher, collector: &mut C) -> io::Result<TimerTree> {
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<u32> = self.terms.iter()
// .map(|term| searcher.doc_freq(term))
// .collect();
// MultiTermScorer {
// search.doc_freq()
// }
// }
fn scorer(&self, searcher: &Searcher) -> MultiTermScorer {
let idfs: Vec<f32> = 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<Term>) -> MultiTermQuery {
MultiTermQuery {
@@ -80,7 +83,6 @@ impl MultiTermQuery {
segment_postings.push(postings);
}
None => {
// currently this is a strict intersection.
segment_postings.push(SegmentPostings::empty());
}
}

View File

@@ -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();
}
}
}