ScoreMode.TOP_SCORES
, this scorer maintains a feedback
loop with the collector in order to know at any time the minimum score that is required in order
for a hit to be competitive.
The implementation supports both minCompetitiveScore by enforce that ∑ max_score >=
minCompetitiveScore
, and minShouldMatch by enforcing freq >= minShouldMatch
. It keeps
sub scorers in 3 different places: - tail: a heap that contains scorers that are behind the
desired doc ID. These scorers are ordered by cost so that we can advance the least costly ones
first. - lead: a linked list of scorer that are positioned on the desired doc ID - head: a heap
that contains scorers which are beyond the desired doc ID, ordered by doc ID in order to move
quickly to the next candidate.
When scoreMode == ScoreMode.TOP_SCORES
, it leverages the max score
from each scorer in order to know when it may call DocIdSetIterator.advance(int)
rather than DocIdSetIterator.nextDoc()
to move to the next
competitive hit. When scoreMode != ScoreMode.TOP_SCORES
, block-max scoring related logic
is skipped. Finding the next match consists of first setting the desired doc ID to the least
entry in 'head', and then advance 'tail' until there is a match, by meeting the configured
freq >= minShouldMatch
and / or ∑ max_score >= minCompetitiveScore
requirements.
-
Nested Class Summary
Nested classes/interfaces inherited from class org.apache.lucene.search.Scorable
Scorable.ChildScorable
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate final Scorer[]
(package private) final long
(package private) int
(package private) static final int
(package private) int
(package private) final DisiPriorityQueue
(package private) DisiWrapper
(package private) long
private static final long
private long
(package private) final int
private final int
(package private) final ScoreMode
(package private) final DisiWrapper[]
(package private) long
(package private) int
(package private) int
-
Constructor Summary
ConstructorsConstructorDescriptionWANDScorer
(Weight weight, Collection<Scorer> scorers, int minShouldMatch, ScoreMode scoreMode) -
Method Summary
Modifier and TypeMethodDescriptionprivate void
addLead
(DisiWrapper lead) Add a disi to the linked list of leads.private void
Add an entry to 'tail'.private void
Advance all entries from the tail to know about all matches on the current doc.private void
advanceHead
(int target) Make sure all disis in 'head' are on or after 'target'.int
advanceShallow
(int target) Advance to the block of documents that containstarget
in order to get scoring information about this block.private void
Pop the entry from the 'tail' that has the greatest score contribution, advance it to the current doc and then add it to 'lead' or 'head' depending on whether it matches.private void
advanceTail
(DisiWrapper disi) int
docID()
Returns the doc ID that is currently being scored.private int
Move iterators to the tail until there is a potential match.private static void
downHeapMaxScore
(DisiWrapper[] heap, int size) private boolean
final Collection
<Scorable.ChildScorable> Returns child sub-scorers positioned on the current documentfloat
getMaxScore
(int upTo) Return the maximum score that documents between the lasttarget
that this iterator wasshallow-advanced
to included andupTo
included.private static boolean
greaterMaxScore
(DisiWrapper w1, DisiWrapper w2) In the tail, we want to get first entries that produce the maximum scores and in case of ties (eg.private DisiWrapper
Insert an entry in 'tail' and evict the least-costly scorer if full.iterator()
Return aDocIdSetIterator
over matching documents.private void
moveToNextCandidate
(int target) Set 'doc' to the next potential match, and move all disis of 'head' that are on this doc into 'lead'.private DisiWrapper
popTail()
Pop the least-costly scorer from 'tail'.private void
pushBackLeads
(int target) Move disis that are in 'lead' back to the tail.(package private) static long
scaleMaxScore
(float maxScore, int scalingFactor) Scale max scores in an unsigned integer to avoid overflows (only the lower 32 bits of the long are used) as well as floating-point arithmetic errors.private static long
scaleMinScore
(float minScore, int scalingFactor) Scale min competitive scores the same way as max scores but this time by rounding down in order to make sure that we do not miss any matches.(package private) static int
scalingFactor
(float f) Return a scaling factor for the given float so thatf x 2^scalingFactor
would be in[2^23, 2^24[
.float
score()
Returns the score of the current document matching the query.void
setMinCompetitiveScore
(float minScore) Optional method: Tell the scorer that its iterator may safely ignore all documents whose score is less than the givenminScore
.Optional method: Return aTwoPhaseIterator
view of thisScorer
.private void
updateMaxScores
(int target) private void
updateMaxScoresIfNecessary
(int target) UpdateupTo
and maximum scores of sub scorers so thatupTo
is greater than or equal to the next candidate aftertarget
, i.e.private static void
upHeapMaxScore
(DisiWrapper[] heap, int i) Heap helpersMethods inherited from class org.apache.lucene.search.Scorable
smoothingScore
-
Field Details
-
FLOAT_MANTISSA_BITS
static final int FLOAT_MANTISSA_BITS- See Also:
-
MAX_SCALED_SCORE
private static final long MAX_SCALED_SCORE- See Also:
-
scalingFactor
private final int scalingFactor -
minCompetitiveScore
private long minCompetitiveScore -
allScorers
-
lead
DisiWrapper lead -
doc
int doc -
leadMaxScore
long leadMaxScore -
head
-
tail
-
tailMaxScore
long tailMaxScore -
tailSize
int tailSize -
cost
final long cost -
upTo
int upTo -
minShouldMatch
final int minShouldMatch -
freq
int freq -
scoreMode
-
-
Constructor Details
-
WANDScorer
WANDScorer(Weight weight, Collection<Scorer> scorers, int minShouldMatch, ScoreMode scoreMode) throws IOException - Throws:
IOException
-
-
Method Details
-
scalingFactor
static int scalingFactor(float f) Return a scaling factor for the given float so thatf x 2^scalingFactor
would be in[2^23, 2^24[
. Special cases:scalingFactor(0) = scalingFactor(MIN_VALUE) + 1 scalingFactor(+Infty) = scalingFactor(MAX_VALUE) - 1
-
scaleMaxScore
static long scaleMaxScore(float maxScore, int scalingFactor) Scale max scores in an unsigned integer to avoid overflows (only the lower 32 bits of the long are used) as well as floating-point arithmetic errors. Those are rounded up in order to make sure we do not miss any matches. -
scaleMinScore
private static long scaleMinScore(float minScore, int scalingFactor) Scale min competitive scores the same way as max scores but this time by rounding down in order to make sure that we do not miss any matches. -
ensureConsistent
private boolean ensureConsistent() -
setMinCompetitiveScore
Description copied from class:Scorable
Optional method: Tell the scorer that its iterator may safely ignore all documents whose score is less than the givenminScore
. This is a no-op by default.This method may only be called from collectors that use
ScoreMode.TOP_SCORES
, and successive calls may only set increasing values ofminScore
.- Overrides:
setMinCompetitiveScore
in classScorable
- Throws:
IOException
-
getChildren
Description copied from class:Scorable
Returns child sub-scorers positioned on the current document- Overrides:
getChildren
in classScorable
- Throws:
IOException
-
iterator
Description copied from class:Scorer
Return aDocIdSetIterator
over matching documents.The returned iterator will either be positioned on
-1
if no documents have been scored yet,DocIdSetIterator.NO_MORE_DOCS
if all documents have been scored already, or the last document id that has been scored otherwise.The returned iterator is a view: calling this method several times will return iterators that have the same state.
-
twoPhaseIterator
Description copied from class:Scorer
Optional method: Return aTwoPhaseIterator
view of thisScorer
. A return value ofnull
indicates that two-phase iteration is not supported.Note that the returned
TwoPhaseIterator
'sapproximation
must advance synchronously with theScorer.iterator()
: advancing the approximation must advance the iterator and vice-versa.Implementing this method is typically useful on
Scorer
s that have a high per-document overhead in order to confirm matches.The default implementation returns
null
.- Overrides:
twoPhaseIterator
in classScorer
-
addLead
Add a disi to the linked list of leads. -
pushBackLeads
Move disis that are in 'lead' back to the tail.- Throws:
IOException
-
advanceHead
Make sure all disis in 'head' are on or after 'target'.- Throws:
IOException
-
advanceTail
- Throws:
IOException
-
advanceTail
Pop the entry from the 'tail' that has the greatest score contribution, advance it to the current doc and then add it to 'lead' or 'head' depending on whether it matches.- Throws:
IOException
-
updateMaxScores
- Throws:
IOException
-
updateMaxScoresIfNecessary
UpdateupTo
and maximum scores of sub scorers so thatupTo
is greater than or equal to the next candidate aftertarget
, i.e. the top of `head`.- Throws:
IOException
-
moveToNextCandidate
Set 'doc' to the next potential match, and move all disis of 'head' that are on this doc into 'lead'.- Throws:
IOException
-
doNextCompetitiveCandidate
Move iterators to the tail until there is a potential match.- Throws:
IOException
-
advanceAllTail
Advance all entries from the tail to know about all matches on the current doc.- Throws:
IOException
-
score
Description copied from class:Scorable
Returns the score of the current document matching the query.- Specified by:
score
in classScorable
- Throws:
IOException
-
advanceShallow
Description copied from class:Scorer
Advance to the block of documents that containstarget
in order to get scoring information about this block. This method is implicitly called byDocIdSetIterator.advance(int)
andDocIdSetIterator.nextDoc()
on the returned doc ID. Calling this method doesn't modify the currentDocIdSetIterator.docID()
. It returns a number that is greater than or equal to all documents contained in the current block, but less than any doc IDS of the next block.target
must be >=Scorable.docID()
as well as all targets that have been passed toScorer.advanceShallow(int)
so far.- Overrides:
advanceShallow
in classScorer
- Throws:
IOException
-
getMaxScore
Description copied from class:Scorer
Return the maximum score that documents between the lasttarget
that this iterator wasshallow-advanced
to included andupTo
included.- Specified by:
getMaxScore
in classScorer
- Throws:
IOException
-
docID
public int docID()Description copied from class:Scorable
Returns the doc ID that is currently being scored. -
insertTailWithOverFlow
Insert an entry in 'tail' and evict the least-costly scorer if full. -
addTail
Add an entry to 'tail'. Fails if over capacity. -
popTail
Pop the least-costly scorer from 'tail'. -
upHeapMaxScore
Heap helpers -
downHeapMaxScore
-
greaterMaxScore
In the tail, we want to get first entries that produce the maximum scores and in case of ties (eg. constant-score queries), those that have the least cost so that they are likely to advance further.
-