Skip to content

Commit af83975

Browse files
committed
No score calls if score is not requested
1 parent a5e59ab commit af83975

File tree

6 files changed

+28
-13
lines changed

6 files changed

+28
-13
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
Tantivy 0.19
22
================================
33

4+
- Skip score calculation, when no scoring is required [#1646](https://github.com/quickwit-oss/tantivy/pull/1646) (@PSeitz)
45
- Limit fast fields to u32 (`get_val(u32)`) [#1644](https://github.com/quickwit-oss/tantivy/pull/1644) (@PSeitz)
56
- Major bugfix: Fix missing fieldnorms for u64, i64, f64, bool, bytes and date [#1620](https://github.com/quickwit-oss/tantivy/pull/1620) (@PSeitz)
67
- Updated [Date Field Type](https://github.com/quickwit-oss/tantivy/pull/1396)

src/collector/mod.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -173,13 +173,13 @@ pub trait Collector: Sync + Send {
173173
let mut segment_collector = self.for_segment(segment_ord as u32, reader)?;
174174

175175
if let Some(alive_bitset) = reader.alive_bitset() {
176-
weight.for_each(reader, &mut |doc, score| {
176+
weight.for_each(reader, self.requires_scoring(), &mut |doc, score| {
177177
if alive_bitset.is_alive(doc) {
178178
segment_collector.collect(doc, score);
179179
}
180180
})?;
181181
} else {
182-
weight.for_each(reader, &mut |doc, score| {
182+
weight.for_each(reader, self.requires_scoring(), &mut |doc, score| {
183183
segment_collector.collect(doc, score);
184184
})?;
185185
}

src/indexer/index_writer.rs

+6-4
Original file line numberDiff line numberDiff line change
@@ -93,14 +93,16 @@ fn compute_deleted_bitset(
9393

9494
// A delete operation should only affect
9595
// document that were inserted before it.
96-
delete_op
97-
.target
98-
.for_each(segment_reader, &mut |doc_matching_delete_query, _| {
96+
delete_op.target.for_each(
97+
segment_reader,
98+
false, // requires_scoring
99+
&mut |doc_matching_delete_query, _| {
99100
if doc_opstamps.is_deleted(doc_matching_delete_query, delete_op.opstamp) {
100101
alive_bitset.remove(doc_matching_delete_query);
101102
might_have_changed = true;
102103
}
103-
})?;
104+
},
105+
)?;
104106
delete_cursor.advance();
105107
}
106108
Ok(might_have_changed)

src/query/boolean_query/boolean_weight.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -204,16 +204,17 @@ impl<TScoreCombiner: ScoreCombiner + Sync> Weight for BooleanWeight<TScoreCombin
204204
fn for_each(
205205
&self,
206206
reader: &SegmentReader,
207+
requires_scoring: bool,
207208
callback: &mut dyn FnMut(DocId, Score),
208209
) -> crate::Result<()> {
209210
let scorer = self.complex_scorer(reader, 1.0, &self.score_combiner_fn)?;
210211
match scorer {
211212
SpecializedScorer::TermUnion(term_scorers) => {
212213
let mut union_scorer = Union::build(term_scorers, &self.score_combiner_fn);
213-
for_each_scorer(&mut union_scorer, callback);
214+
for_each_scorer(&mut union_scorer, requires_scoring, callback);
214215
}
215216
SpecializedScorer::Other(mut scorer) => {
216-
for_each_scorer(scorer.as_mut(), callback);
217+
for_each_scorer(scorer.as_mut(), requires_scoring, callback);
217218
}
218219
}
219220
Ok(())

src/query/term_query/term_weight.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,11 @@ impl Weight for TermWeight {
4949
fn for_each(
5050
&self,
5151
reader: &SegmentReader,
52+
requires_scoring: bool,
5253
callback: &mut dyn FnMut(DocId, Score),
5354
) -> crate::Result<()> {
5455
let mut scorer = self.specialized_scorer(reader, 1.0)?;
55-
for_each_scorer(&mut scorer, callback);
56+
for_each_scorer(&mut scorer, requires_scoring, callback);
5657
Ok(())
5758
}
5859

src/query/weight.rs

+14-4
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,21 @@ use crate::{DocId, Score, TERMINATED};
77
/// `DocSet` and push the scored documents to the collector.
88
pub(crate) fn for_each_scorer<TScorer: Scorer + ?Sized>(
99
scorer: &mut TScorer,
10+
requires_scoring: bool,
1011
callback: &mut dyn FnMut(DocId, Score),
1112
) {
1213
let mut doc = scorer.doc();
13-
while doc != TERMINATED {
14-
callback(doc, scorer.score());
15-
doc = scorer.advance();
14+
15+
if requires_scoring {
16+
while doc != TERMINATED {
17+
callback(doc, scorer.score());
18+
doc = scorer.advance();
19+
}
20+
} else {
21+
while doc != TERMINATED {
22+
callback(doc, 0.0);
23+
doc = scorer.advance();
24+
}
1625
}
1726
}
1827

@@ -71,10 +80,11 @@ pub trait Weight: Send + Sync + 'static {
7180
fn for_each(
7281
&self,
7382
reader: &SegmentReader,
83+
requires_scoring: bool,
7484
callback: &mut dyn FnMut(DocId, Score),
7585
) -> crate::Result<()> {
7686
let mut scorer = self.scorer(reader, 1.0)?;
77-
for_each_scorer(scorer.as_mut(), callback);
87+
for_each_scorer(scorer.as_mut(), requires_scoring, callback);
7888
Ok(())
7989
}
8090

0 commit comments

Comments
 (0)