blob: 7e1ac0716b3dc24586a6145178969177644bbe02 [file] [log] [blame]
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);