| Index: lucene/core/src/java/org/apache/lucene/search/spans/ContainSpans.java |
| =================================================================== |
| --- lucene/core/src/java/org/apache/lucene/search/spans/ContainSpans.java (revision 1685832) |
| +++ lucene/core/src/java/org/apache/lucene/search/spans/ContainSpans.java (working copy) |
| @@ -48,6 +48,11 @@ |
| } |
| |
| @Override |
| + public int distance() { |
| + return sourceSpans.distance(); |
| + } |
| + |
| + @Override |
| public void collect(SpanCollector collector) throws IOException { |
| sourceSpans.collect(collector); |
| } |
| Index: lucene/core/src/java/org/apache/lucene/search/spans/FilterSpans.java |
| =================================================================== |
| --- lucene/core/src/java/org/apache/lucene/search/spans/FilterSpans.java (revision 1685832) |
| +++ lucene/core/src/java/org/apache/lucene/search/spans/FilterSpans.java (working copy) |
| @@ -111,6 +111,11 @@ |
| } |
| |
| @Override |
| + public int distance() { |
| + return in.distance(); |
| + } |
| + |
| + @Override |
| public void collect(SpanCollector collector) throws IOException { |
| in.collect(collector); |
| } |
| Index: lucene/core/src/java/org/apache/lucene/search/spans/NearSpansOrdered.java |
| =================================================================== |
| --- lucene/core/src/java/org/apache/lucene/search/spans/NearSpansOrdered.java (revision 1685832) |
| +++ lucene/core/src/java/org/apache/lucene/search/spans/NearSpansOrdered.java (working copy) |
| @@ -129,6 +129,11 @@ |
| } |
| |
| @Override |
| + public int distance() { |
| + return matchWidth; |
| + } |
| + |
| + @Override |
| public void collect(SpanCollector collector) throws IOException { |
| for (Spans span : subSpans) { |
| span.collect(collector); |
| Index: lucene/core/src/java/org/apache/lucene/search/spans/NearSpansUnordered.java |
| =================================================================== |
| --- lucene/core/src/java/org/apache/lucene/search/spans/NearSpansUnordered.java (revision 1685832) |
| +++ lucene/core/src/java/org/apache/lucene/search/spans/NearSpansUnordered.java (working copy) |
| @@ -115,6 +115,11 @@ |
| } |
| |
| @Override |
| + public int distance() { |
| + return in.distance(); |
| + } |
| + |
| + @Override |
| public void collect(SpanCollector collector) throws IOException { |
| in.collect(collector); |
| } |
| @@ -242,6 +247,11 @@ |
| } |
| |
| @Override |
| + public int distance() { |
| + return maxEndPositionCell.startPosition() - minPositionCell().startPosition(); |
| + } |
| + |
| + @Override |
| public void collect(SpanCollector collector) throws IOException { |
| for (SpansCell cell : subSpanCells) { |
| cell.collect(collector); |
| Index: lucene/core/src/java/org/apache/lucene/search/spans/SpanOrQuery.java |
| =================================================================== |
| --- lucene/core/src/java/org/apache/lucene/search/spans/SpanOrQuery.java (revision 1685832) |
| +++ lucene/core/src/java/org/apache/lucene/search/spans/SpanOrQuery.java (working copy) |
| @@ -329,6 +329,11 @@ |
| } |
| |
| @Override |
| + public int distance() { |
| + return topPositionSpans.distance(); |
| + } |
| + |
| + @Override |
| public void collect(SpanCollector collector) throws IOException { |
| if (topPositionSpans != null) |
| topPositionSpans.collect(collector); |
| Index: lucene/core/src/java/org/apache/lucene/search/spans/SpanScorer.java |
| =================================================================== |
| --- lucene/core/src/java/org/apache/lucene/search/spans/SpanScorer.java (revision 1685832) |
| +++ lucene/core/src/java/org/apache/lucene/search/spans/SpanScorer.java (working copy) |
| @@ -99,8 +99,7 @@ |
| freq = 1; |
| return; |
| } |
| - int matchLength = endPos - startPos; |
| - freq += docScorer.computeSlopFactor(matchLength); |
| + freq += docScorer.computeSlopFactor(spans.distance()); |
| prevStartPos = startPos; |
| prevEndPos = endPos; |
| startPos = spans.nextStartPosition(); |
| Index: lucene/core/src/java/org/apache/lucene/search/spans/Spans.java |
| =================================================================== |
| --- lucene/core/src/java/org/apache/lucene/search/spans/Spans.java (revision 1685832) |
| +++ lucene/core/src/java/org/apache/lucene/search/spans/Spans.java (working copy) |
| @@ -19,6 +19,7 @@ |
| |
| import org.apache.lucene.search.DocIdSetIterator; |
| import org.apache.lucene.search.TwoPhaseIterator; |
| +import org.apache.lucene.search.similarities.Similarity.SimScorer; |
| |
| import java.io.IOException; |
| |
| @@ -50,6 +51,14 @@ |
| public abstract int endPosition(); |
| |
| /** |
| + * Return the distance to an ideal match, which is typically used to compute |
| + * the {@link SimScorer#computeSlopFactor(int) slop factor}. It is only legal |
| + * to call this method when the iterator is on a valid doc ID and positioned. |
| + * The return value must be positive. |
| + */ |
| + public abstract int distance(); |
| + |
| + /** |
| * Collect postings data from the leaves of the current Spans. |
| * |
| * This method should only be called after {@link #nextStartPosition()}, and before |
| Index: lucene/core/src/java/org/apache/lucene/search/spans/TermSpans.java |
| =================================================================== |
| --- lucene/core/src/java/org/apache/lucene/search/spans/TermSpans.java (revision 1685832) |
| +++ lucene/core/src/java/org/apache/lucene/search/spans/TermSpans.java (working copy) |
| @@ -102,6 +102,11 @@ |
| } |
| |
| @Override |
| + public int distance() { |
| + return 0; |
| + } |
| + |
| + @Override |
| public long cost() { |
| return postings.cost(); |
| } |
| Index: lucene/core/src/test/org/apache/lucene/search/spans/JustCompileSearchSpans.java |
| =================================================================== |
| --- lucene/core/src/test/org/apache/lucene/search/spans/JustCompileSearchSpans.java (revision 1685832) |
| +++ lucene/core/src/test/org/apache/lucene/search/spans/JustCompileSearchSpans.java (working copy) |
| @@ -61,6 +61,11 @@ |
| } |
| |
| @Override |
| + public int distance() { |
| + throw new UnsupportedOperationException(UNSUPPORTED_MSG); |
| + } |
| + |
| + @Override |
| public void collect(SpanCollector collector) throws IOException { |
| |
| } |
| @@ -123,6 +128,11 @@ |
| } |
| |
| @Override |
| + public int distance() { |
| + throw new UnsupportedOperationException(UNSUPPORTED_MSG); |
| + } |
| + |
| + @Override |
| public void collect(SpanCollector collector) throws IOException { |
| |
| } |
| Index: lucene/core/src/test/org/apache/lucene/search/spans/TestSpanSearchEquivalence.java |
| =================================================================== |
| --- lucene/core/src/test/org/apache/lucene/search/spans/TestSpanSearchEquivalence.java (revision 1685832) |
| +++ lucene/core/src/test/org/apache/lucene/search/spans/TestSpanSearchEquivalence.java (working copy) |
| @@ -39,7 +39,7 @@ |
| /** SpanTermQuery(A) = TermQuery(A) */ |
| public void testSpanTermVersusTerm() throws Exception { |
| Term t1 = randomTerm(); |
| - assertSameSet(new TermQuery(t1), spanQuery(new SpanTermQuery(t1))); |
| + assertSameScores(new TermQuery(t1), spanQuery(new SpanTermQuery(t1))); |
| } |
| |
| /** SpanOrQuery(A) = SpanTermQuery(A) */ |
| @@ -154,7 +154,7 @@ |
| }; |
| SpanQuery q1 = spanQuery(new SpanNearQuery(subquery, 0, true)); |
| PhraseQuery q2 = new PhraseQuery(t1.field(), t1.bytes(), t2.bytes()); |
| - assertSameSet(q1, q2); |
| + assertSameScores(q1, q2); |
| } |
| |
| /** SpanNearQuery([A, B], ∞, false) = +A +B */ |
| Index: lucene/core/src/test/org/apache/lucene/search/spans/TestSpansAdvanced.java |
| =================================================================== |
| --- lucene/core/src/test/org/apache/lucene/search/spans/TestSpansAdvanced.java (revision 1685832) |
| +++ lucene/core/src/test/org/apache/lucene/search/spans/TestSpansAdvanced.java (working copy) |
| @@ -100,7 +100,7 @@ |
| */ |
| public void testBooleanQueryWithSpanQueries() throws IOException { |
| |
| - doTestBooleanQueryWithSpanQueries(searcher, 0.3884282f); |
| + doTestBooleanQueryWithSpanQueries(searcher, 0.54932045f); |
| } |
| |
| /** |
| Index: lucene/core/src/test/org/apache/lucene/search/spans/TestSpansAdvanced2.java |
| =================================================================== |
| --- lucene/core/src/test/org/apache/lucene/search/spans/TestSpansAdvanced2.java (revision 1685832) |
| +++ lucene/core/src/test/org/apache/lucene/search/spans/TestSpansAdvanced2.java (working copy) |
| @@ -86,8 +86,8 @@ |
| final Query spanQuery = new SpanTermQuery(new Term(FIELD_TEXT, "should")); |
| final String[] expectedIds = new String[] {"B", "D", "1", "2", "3", "4", |
| "A"}; |
| - final float[] expectedScores = new float[] {0.625f, 0.45927936f, |
| - 0.35355338f, 0.35355338f, 0.35355338f, 0.35355338f, 0.26516503f,}; |
| + final float[] expectedScores = new float[] {0.8838834f, 0.64951903f, |
| + 0.5f, 0.5f, 0.5f, 0.5f, 0.375f,}; |
| assertHits(searcher2, spanQuery, "single span query", expectedIds, |
| expectedScores); |
| } |
| @@ -104,8 +104,7 @@ |
| query.add(spanQuery2, BooleanClause.Occur.MUST); |
| final String[] expectedIds = new String[] {"D", "A"}; |
| // these values were pre LUCENE-413 |
| - // final float[] expectedScores = new float[] { 0.93163157f, 0.20698164f }; |
| - final float[] expectedScores = new float[] {1.0191123f, 0.93163157f}; |
| + final float[] expectedScores = new float[] {1.44124233f, 1.31752586f}; |
| assertHits(searcher2, query, "multiple different span queries", |
| expectedIds, expectedScores); |
| } |
| @@ -116,6 +115,6 @@ |
| @Override |
| public void testBooleanQueryWithSpanQueries() throws IOException { |
| |
| - doTestBooleanQueryWithSpanQueries(searcher2, 0.73500174f); |
| + doTestBooleanQueryWithSpanQueries(searcher2, 1.0394494f); |
| } |
| } |
| Index: lucene/test-framework/src/java/org/apache/lucene/search/spans/AssertingSpans.java |
| =================================================================== |
| --- lucene/test-framework/src/java/org/apache/lucene/search/spans/AssertingSpans.java (revision 1685832) |
| +++ lucene/test-framework/src/java/org/apache/lucene/search/spans/AssertingSpans.java (working copy) |
| @@ -125,6 +125,14 @@ |
| } |
| |
| @Override |
| + public int distance() { |
| + assert state == State.ITERATING; |
| + final int distance = in.distance(); |
| + assert distance >= 0; |
| + return distance; |
| + } |
| + |
| + @Override |
| public void collect(SpanCollector collector) throws IOException { |
| assert state == State.ITERATING : "collect() called in illegal state: " + state + ": " + in; |
| in.collect(collector); |