Class MinShouldMatchSumScorer


  • final class MinShouldMatchSumScorer
    extends Scorer
    A Scorer for BooleanQuery when minShouldMatch is between 2 and the total number of clauses. This implementation keeps sub scorers in 3 different places: - lead: a linked list of scorer that are positioned on the desired doc ID - tail: a heap that contains at most minShouldMatch - 1 scorers that are behind the desired doc ID. These scorers are ordered by cost so that we can advance the least costly ones first. - 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. 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.
    • Constructor Detail

      • MinShouldMatchSumScorer

        MinShouldMatchSumScorer​(Weight weight,
                                java.util.Collection<Scorer> scorers,
                                int minShouldMatch)
    • Method Detail

      • getChildren

        public final java.util.Collection<Scorable.ChildScorable> getChildren()
                                                                       throws java.io.IOException
        Description copied from class: Scorable
        Returns child sub-scorers positioned on the current document
        Overrides:
        getChildren in class Scorable
        Throws:
        java.io.IOException
      • iterator

        public DocIdSetIterator iterator()
        Description copied from class: Scorer
        Return a DocIdSetIterator 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.
        Specified by:
        iterator in class Scorer
      • twoPhaseIterator

        public TwoPhaseIterator twoPhaseIterator()
        Description copied from class: Scorer
        Optional method: Return a TwoPhaseIterator view of this Scorer. A return value of null indicates that two-phase iteration is not supported. Note that the returned TwoPhaseIterator's approximation must advance synchronously with the Scorer.iterator(): advancing the approximation must advance the iterator and vice-versa. Implementing this method is typically useful on Scorers that have a high per-document overhead in order to confirm matches. The default implementation returns null.
        Overrides:
        twoPhaseIterator in class Scorer
      • pushBackLeads

        private void pushBackLeads()
                            throws java.io.IOException
        Throws:
        java.io.IOException
      • advanceTail

        private void advanceTail​(DisiWrapper top)
                          throws java.io.IOException
        Throws:
        java.io.IOException
      • advanceTail

        private void advanceTail()
                          throws java.io.IOException
        Throws:
        java.io.IOException
      • setDocAndFreq

        private void setDocAndFreq()
        Reinitializes head, freq and doc from 'head'
      • doNext

        private int doNext()
                    throws java.io.IOException
        Advance tail to the lead until there is a match.
        Throws:
        java.io.IOException
      • doNextCandidate

        private int doNextCandidate()
                             throws java.io.IOException
        Move iterators to the tail until the cumulated size of lead+tail is greater than or equal to minShouldMath
        Throws:
        java.io.IOException
      • updateFreq

        private void updateFreq()
                         throws java.io.IOException
        Advance all entries from the tail to know about all matches on the current doc.
        Throws:
        java.io.IOException
      • score

        public float score()
                    throws java.io.IOException
        Description copied from class: Scorable
        Returns the score of the current document matching the query.
        Specified by:
        score in class Scorable
        Throws:
        java.io.IOException
      • getMaxScore

        public float getMaxScore​(int upTo)
                          throws java.io.IOException
        Description copied from class: Scorer
        Return the maximum score that documents between the last target that this iterator was shallow-advanced to included and upTo included.
        Specified by:
        getMaxScore in class Scorer
        Throws:
        java.io.IOException
      • docID

        public int docID()
        Description copied from class: Scorable
        Returns the doc ID that is currently being scored.
        Specified by:
        docID in class Scorable
      • insertTailWithOverFlow

        private DisiWrapper insertTailWithOverFlow​(DisiWrapper s)
        Insert an entry in 'tail' and evict the least-costly scorer if full.
      • addTail

        private void addTail​(DisiWrapper s)
        Add an entry to 'tail'. Fails if over capacity.
      • popTail

        private DisiWrapper popTail()
        Pop the least-costly scorer from 'tail'.
      • upHeapCost

        private static void upHeapCost​(DisiWrapper[] heap,
                                       int i)
        Heap helpers
      • downHeapCost

        private static void downHeapCost​(DisiWrapper[] heap,
                                         int size)