You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by rm...@apache.org on 2015/04/03 20:38:28 UTC

svn commit: r1671123 - in /lucene/dev/trunk/lucene: ./ core/src/java/org/apache/lucene/search/payloads/ core/src/java/org/apache/lucene/search/spans/ core/src/test/org/apache/lucene/search/spans/

Author: rmuir
Date: Fri Apr  3 18:38:27 2015
New Revision: 1671123

URL: http://svn.apache.org/r1671123
Log:
LUCENE-6391: Give SpanScorer two-phase iterator support

Modified:
    lucene/dev/trunk/lucene/CHANGES.txt
    lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/payloads/PayloadNearQuery.java
    lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/payloads/PayloadTermQuery.java
    lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanPositionCheckQuery.java
    lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanScorer.java
    lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/spans/JustCompileSearchSpans.java

Modified: lucene/dev/trunk/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/CHANGES.txt?rev=1671123&r1=1671122&r2=1671123&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/CHANGES.txt (original)
+++ lucene/dev/trunk/lucene/CHANGES.txt Fri Apr  3 18:38:27 2015
@@ -40,7 +40,8 @@ API Changes
 
 New Features
 
-* LUCENE-6308, LUCENE-6385: Span queries now share document conjunction/intersection
+* LUCENE-6308, LUCENE-6385, LUCENE-6391: Span queries now share 
+  document conjunction/intersection
   code with boolean queries, and use two-phased iterators for
   faster intersection by avoiding loading positions in certain cases.
   (Paul Elschot, Terry Smith, Robert Muir via Mike McCandless)

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/payloads/PayloadNearQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/payloads/PayloadNearQuery.java?rev=1671123&r1=1671122&r2=1671123&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/payloads/PayloadNearQuery.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/payloads/PayloadNearQuery.java Fri Apr  3 18:38:27 2015
@@ -232,8 +232,8 @@ public class PayloadNearQuery extends Sp
         scratch.bytes = thePayload;
         scratch.offset = 0;
         scratch.length = thePayload.length;
-        payloadScore = function.currentScore(doc, fieldName, start, end,
-            payloadsSeen, payloadScore, docScorer.computePayloadFactor(doc,
+        payloadScore = function.currentScore(docID(), fieldName, start, end,
+            payloadsSeen, payloadScore, docScorer.computePayloadFactor(docID(),
                 spans.startPosition(), spans.endPosition(), scratch));
         ++payloadsSeen;
       }
@@ -241,7 +241,7 @@ public class PayloadNearQuery extends Sp
 
     //
     @Override
-    protected boolean setFreqCurrentDoc() throws IOException {
+    protected void setFreqCurrentDoc() throws IOException {
       freq = 0.0f;
       payloadScore = 0;
       payloadsSeen = 0;
@@ -255,14 +255,12 @@ public class PayloadNearQuery extends Sp
         getPayloads(spansArr);            
         startPos = spans.nextStartPosition();
       } while (startPos != Spans.NO_MORE_POSITIONS);
-      return true;
     }
 
     @Override
-    public float score() throws IOException {
-
-      return super.score()
-          * function.docScore(doc, fieldName, payloadsSeen, payloadScore);
+    public float scoreCurrentDoc() throws IOException {
+      return super.scoreCurrentDoc()
+          * function.docScore(docID(), fieldName, payloadsSeen, payloadScore);
     }
   }
 

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/payloads/PayloadTermQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/payloads/PayloadTermQuery.java?rev=1671123&r1=1671122&r2=1671123&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/payloads/PayloadTermQuery.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/payloads/PayloadTermQuery.java Fri Apr  3 18:38:27 2015
@@ -99,7 +99,7 @@ public class PayloadTermQuery extends Sp
       }
 
       @Override
-      protected boolean setFreqCurrentDoc() throws IOException {
+      protected void setFreqCurrentDoc() throws IOException {
         freq = 0.0f;
         numMatches = 0;
         payloadScore = 0;
@@ -115,7 +115,6 @@ public class PayloadTermQuery extends Sp
 
           startPos = spans.nextStartPosition();
         } while (startPos != Spans.NO_MORE_POSITIONS);
-        return freq != 0;
       }
 
       protected void processPayload(Similarity similarity) throws IOException {
@@ -123,11 +122,11 @@ public class PayloadTermQuery extends Sp
           final PostingsEnum postings = termSpans.getPostings();
           payload = postings.getPayload();
           if (payload != null) {
-            payloadScore = function.currentScore(doc, term.field(),
+            payloadScore = function.currentScore(docID(), term.field(),
                                                  spans.startPosition(), spans.endPosition(), payloadsSeen, payloadScore,
-                                                 docScorer.computePayloadFactor(doc, spans.startPosition(), spans.endPosition(), payload));
+                                                 docScorer.computePayloadFactor(docID(), spans.startPosition(), spans.endPosition(), payload));
           } else {
-            payloadScore = function.currentScore(doc, term.field(),
+            payloadScore = function.currentScore(docID(), term.field(),
                                                  spans.startPosition(), spans.endPosition(), payloadsSeen, payloadScore, 1F);
           }
           payloadsSeen++;
@@ -143,8 +142,7 @@ public class PayloadTermQuery extends Sp
        * @throws IOException if there is a low-level I/O error
        */
       @Override
-      public float score() throws IOException {
-
+      public float scoreCurrentDoc() throws IOException {
         return includeSpanScore ? getSpanScore() * getPayloadScore()
             : getPayloadScore();
       }
@@ -160,7 +158,7 @@ public class PayloadTermQuery extends Sp
        * @see #score()
        */
       protected float getSpanScore() throws IOException {
-        return super.score();
+        return super.scoreCurrentDoc();
       }
 
       /**
@@ -170,7 +168,7 @@ public class PayloadTermQuery extends Sp
        *         {@link PayloadFunction#docScore(int, String, int, float)}
        */
       protected float getPayloadScore() {
-        return function.docScore(doc, term.field(), payloadsSeen, payloadScore);
+        return function.docScore(docID(), term.field(), payloadsSeen, payloadScore);
       }
     }
     

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanPositionCheckQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanPositionCheckQuery.java?rev=1671123&r1=1671122&r2=1671123&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanPositionCheckQuery.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanPositionCheckQuery.java Fri Apr  3 18:38:27 2015
@@ -146,7 +146,7 @@ public abstract class SpanPositionCheckQ
       startPos = in.nextStartPosition();
       assert startPos != NO_MORE_POSITIONS;
       for (;;) {
-        switch(acceptPosition(this)) {
+        switch(acceptPosition(in)) {
           case YES:
             atFirstInCurrentDoc = true;
             return in.docID();
@@ -180,7 +180,7 @@ public abstract class SpanPositionCheckQ
         if (startPos == NO_MORE_POSITIONS) {
           return NO_MORE_POSITIONS;
         }
-        switch(acceptPosition(this)) {
+        switch(acceptPosition(in)) {
           case YES:
             return startPos;
           case NO:

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanScorer.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanScorer.java?rev=1671123&r1=1671122&r2=1671123&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanScorer.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanScorer.java Fri Apr  3 18:38:27 2015
@@ -21,48 +21,58 @@ import java.io.IOException;
 import java.util.Objects;
 
 import org.apache.lucene.search.Scorer;
+import org.apache.lucene.search.TwoPhaseIterator;
 import org.apache.lucene.search.similarities.Similarity;
 
 /**
  * Public for extension only.
  */
 public class SpanScorer extends Scorer {
-  protected Spans spans;
+  /** underlying spans we are scoring from */
+  protected final Spans spans;
+  /** similarity used in default score impl */
+  protected final Similarity.SimScorer docScorer;
 
-  protected int doc;
+  /** accumulated sloppy freq (computed in setFreqCurrentDoc) */
   protected float freq;
+  /** number of matches (computed in setFreqCurrentDoc) */
   protected int numMatches;
-  protected final Similarity.SimScorer docScorer;
+  
+  private int lastScoredDoc = -1; // last doc we called setFreqCurrentDoc() for
 
-  protected SpanScorer(Spans spans, SpanWeight weight, Similarity.SimScorer docScorer)
-  throws IOException {
+  protected SpanScorer(Spans spans, SpanWeight weight, Similarity.SimScorer docScorer) throws IOException {
     super(weight);
     this.docScorer = Objects.requireNonNull(docScorer);
     this.spans = Objects.requireNonNull(spans);
-    this.doc = -1;
   }
 
   @Override
-  public int nextDoc() throws IOException {
-    int prevDoc = doc;
-    doc = spans.nextDoc();
-    if (doc != NO_MORE_DOCS) {
-      setFreqCurrentDoc();
-    }
-    return doc;
+  public final int nextDoc() throws IOException {
+    return spans.nextDoc();
   }
 
   @Override
-  public int advance(int target) throws IOException {
-    int prevDoc = doc;
-    doc = spans.advance(target);
-    if (doc != NO_MORE_DOCS) {
+  public final int advance(int target) throws IOException {
+    return spans.advance(target);
+  }
+  
+  /** 
+   * Ensure setFreqCurrentDoc is called, if not already called for the current doc.
+   */
+  private final void ensureFreq() throws IOException {
+    int currentDoc = spans.docID();
+    if (lastScoredDoc != currentDoc) {
       setFreqCurrentDoc();
+      lastScoredDoc = currentDoc;
     }
-    return doc;
   }
 
-  protected boolean setFreqCurrentDoc() throws IOException {
+  /**
+   * Sets {@link #freq} and {@link #numMatches} for the current document.
+   * <p>
+   * This will be called at most once per document.
+   */
+  protected void setFreqCurrentDoc() throws IOException {
     freq = 0.0f;
     numMatches = 0;
 
@@ -90,34 +100,46 @@ public class SpanScorer extends Scorer {
 
     assert spans.startPosition() == Spans.NO_MORE_POSITIONS : "incorrect final start position, spans="+spans;
     assert spans.endPosition() == Spans.NO_MORE_POSITIONS : "incorrect final end position, spans="+spans;
-
-    return true;
+  }
+  
+  /**
+   * Score the current doc. The default implementation scores the doc 
+   * with the similarity using the slop-adjusted {@link #freq}.
+   */
+  protected float scoreCurrentDoc() throws IOException {
+    return docScorer.score(spans.docID(), freq);
   }
 
   @Override
-  public int docID() { return doc; }
+  public final int docID() { return spans.docID(); }
 
   @Override
-  public float score() throws IOException {
-    float s = docScorer.score(doc, freq);
-    return s;
+  public final float score() throws IOException {
+    ensureFreq();
+    return scoreCurrentDoc();
   }
 
   @Override
-  public int freq() throws IOException {
+  public final int freq() throws IOException {
+    ensureFreq();
     return numMatches;
   }
 
   /** Returns the intermediate "sloppy freq" adjusted for edit distance
    *  @lucene.internal */
   // only public so .payloads can see it.
-  public float sloppyFreq() throws IOException {
+  public final float sloppyFreq() throws IOException {
+    ensureFreq();
     return freq;
   }
 
   @Override
-  public long cost() {
+  public final long cost() {
     return spans.cost();
   }
 
+  @Override
+  public final TwoPhaseIterator asTwoPhaseIterator() {
+    return spans.asTwoPhaseIterator();
+  }
 }

Modified: lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/spans/JustCompileSearchSpans.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/spans/JustCompileSearchSpans.java?rev=1671123&r1=1671122&r2=1671123&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/spans/JustCompileSearchSpans.java (original)
+++ lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/spans/JustCompileSearchSpans.java Fri Apr  3 18:38:27 2015
@@ -162,7 +162,12 @@ final class JustCompileSearchSpans {
     }
 
     @Override
-    protected boolean setFreqCurrentDoc() {
+    protected void setFreqCurrentDoc() {
+      throw new UnsupportedOperationException(UNSUPPORTED_MSG);
+    }
+
+    @Override
+    protected float scoreCurrentDoc() throws IOException {
       throw new UnsupportedOperationException(UNSUPPORTED_MSG);
     }
   }