mirror of
https://github.com/quickwit-oss/tantivy.git
synced 2026-01-09 02:22:54 +00:00
- Change in the DocSet and Scorer API. (@fulmicoton).
A freshly created DocSet point directly to their first doc. A sentinel value called TERMINATED marks the end of a DocSet.
`.advance()` returns the new DocId. `Scorer::skip(target)` has been replaced by `Scorer::seek(target)` and returns the resulting DocId.
As a result, iterating through DocSet now looks as follows
```rust
let mut doc = docset.doc();
while doc != TERMINATED {
// ...
doc = docset.advance();
}
```
The change made it possible to greatly simplify a lot of the docset's code.
- Misc internal optimization and introduction of the `Scorer::for_each_pruning` function. (@fulmicoton)
72 lines
1.6 KiB
Rust
72 lines
1.6 KiB
Rust
use crate::docset::DocSet;
|
|
use crate::query::{Explanation, Scorer};
|
|
use crate::DocId;
|
|
use crate::Score;
|
|
|
|
use crate::fieldnorm::FieldNormReader;
|
|
use crate::postings::Postings;
|
|
use crate::postings::SegmentPostings;
|
|
use crate::query::bm25::BM25Weight;
|
|
|
|
pub struct TermScorer {
|
|
postings: SegmentPostings,
|
|
fieldnorm_reader: FieldNormReader,
|
|
similarity_weight: BM25Weight,
|
|
}
|
|
|
|
impl TermScorer {
|
|
pub fn new(
|
|
postings: SegmentPostings,
|
|
fieldnorm_reader: FieldNormReader,
|
|
similarity_weight: BM25Weight,
|
|
) -> TermScorer {
|
|
TermScorer {
|
|
postings,
|
|
fieldnorm_reader,
|
|
similarity_weight,
|
|
}
|
|
}
|
|
}
|
|
|
|
impl TermScorer {
|
|
pub fn term_freq(&self) -> u32 {
|
|
self.postings.term_freq()
|
|
}
|
|
|
|
pub fn fieldnorm_id(&self) -> u8 {
|
|
self.fieldnorm_reader.fieldnorm_id(self.doc())
|
|
}
|
|
|
|
pub fn explain(&self) -> Explanation {
|
|
let fieldnorm_id = self.fieldnorm_id();
|
|
let term_freq = self.term_freq();
|
|
self.similarity_weight.explain(fieldnorm_id, term_freq)
|
|
}
|
|
}
|
|
|
|
impl DocSet for TermScorer {
|
|
fn advance(&mut self) -> DocId {
|
|
self.postings.advance()
|
|
}
|
|
|
|
fn seek(&mut self, target: DocId) -> DocId {
|
|
self.postings.seek(target)
|
|
}
|
|
|
|
fn doc(&self) -> DocId {
|
|
self.postings.doc()
|
|
}
|
|
|
|
fn size_hint(&self) -> u32 {
|
|
self.postings.size_hint()
|
|
}
|
|
}
|
|
|
|
impl Scorer for TermScorer {
|
|
fn score(&mut self) -> Score {
|
|
let fieldnorm_id = self.fieldnorm_id();
|
|
let term_freq = self.term_freq();
|
|
self.similarity_weight.score(fieldnorm_id, term_freq)
|
|
}
|
|
}
|