From 0300e7272bf4691d2dee24c1fb05e2c2a3f7c59c Mon Sep 17 00:00:00 2001 From: Paul Masurel Date: Sat, 17 Feb 2018 11:56:21 +0900 Subject: [PATCH] Scoring for union. --- src/postings/union.rs | 23 ++++++++++++++++++++++- src/query/boolean_query/boolean_weight.rs | 21 ++++----------------- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/src/postings/union.rs b/src/postings/union.rs index 853cae685..6b3de16d4 100644 --- a/src/postings/union.rs +++ b/src/postings/union.rs @@ -4,6 +4,7 @@ use postings::SkipResult; use common::TinySet; use std::cmp::Ordering; use DocId; +use Score; use query::score_combiner::{DoNothingCombiner, ScoreCombiner}; const HORIZON_NUM_TINYBITSETS: usize = 32; @@ -18,6 +19,7 @@ pub struct Union cursor: usize, offset: DocId, doc: DocId, + score: Score, } impl From> @@ -44,6 +46,7 @@ impl From> cursor: HORIZON_NUM_TINYBITSETS, offset: 0, doc: 0, + score: 0f32 } } } @@ -89,7 +92,11 @@ impl Union bool { while self.cursor < HORIZON_NUM_TINYBITSETS { if let Some(val) = self.bitsets[self.cursor].pop_lowest() { - self.doc = self.offset + val + (self.cursor as u32) * 64; + let delta = val + (self.cursor as u32) * 64; + self.doc = self.offset + delta; + let score_combiner = &mut self.scores[delta as usize]; + self.score = score_combiner.score(); + score_combiner.clear(); return true; } else { self.cursor += 1; @@ -129,6 +136,9 @@ impl DocSet for Union DocSet for Union= to the target. @@ -186,6 +199,14 @@ impl DocSet for Union Scorer for Union + where TScoreCombiner: ScoreCombiner, + TScorer: Scorer { + fn score(&mut self) -> Score { + self.score + } +} + #[cfg(test)] mod tests { diff --git a/src/query/boolean_query/boolean_weight.rs b/src/query/boolean_query/boolean_weight.rs index e88ed5168..ab7039d2e 100644 --- a/src/query/boolean_query/boolean_weight.rs +++ b/src/query/boolean_query/boolean_weight.rs @@ -11,13 +11,15 @@ use query::RequiredOptionalScorer; use query::score_combiner::{SumWithCoordsCombiner, DoNothingCombiner, ScoreCombiner}; use Result; -fn scorer_union<'a, TScoreCombiner: ScoreCombiner + 'static>(docsets: Vec>) -> Box { +fn scorer_union<'a, TScoreCombiner>(docsets: Vec>) -> Box + where TScoreCombiner: ScoreCombiner + 'static +{ assert!(!docsets.is_empty()); if docsets.len() == 1 { docsets.into_iter().next().unwrap() //< we checked the size beforehands } else { // TODO have a UnionScorer instead. - box ConstScorer::new(Union::<_, TScoreCombiner>::from(docsets)) + box Union::<_, TScoreCombiner>::from(docsets) } } @@ -84,21 +86,6 @@ impl BooleanWeight { Ok(positive_scorer) } } - -// fn scorer_if_scoring_enabled<'a>( -// &'a self, -// reader: &'a SegmentReader, -// ) -> Result> { -// let sub_scorers: Vec> = self.weights -// .iter() -// .map(|&(_, ref weight)| weight) -// .map(|weight| weight.scorer(reader)) -// .collect::>()?; -// let occurs: Vec = self.weights.iter().map(|&(ref occur, _)| *occur).collect(); -// let occur_filter = OccurFilter::new(&occurs); -// let boolean_scorer = BooleanScorer::new(sub_scorers, occur_filter); -// Ok(box boolean_scorer) -// } } impl Weight for BooleanWeight {