mirror of https://github.com/apache/lucene.git
LUCENE-1379: fix corner case when Similarity.sloppyFreq() returns 0.0 the last matching doc is skipped
git-svn-id: https://svn.apache.org/repos/asf/lucene/java/trunk@696013 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
088a42b846
commit
31811e9f45
|
@ -77,12 +77,12 @@ public class SpanScorer extends Scorer {
|
||||||
}
|
}
|
||||||
doc = spans.doc();
|
doc = spans.doc();
|
||||||
freq = 0.0f;
|
freq = 0.0f;
|
||||||
while (more && doc == spans.doc()) {
|
do {
|
||||||
int matchLength = spans.end() - spans.start();
|
int matchLength = spans.end() - spans.start();
|
||||||
freq += getSimilarity().sloppyFreq(matchLength);
|
freq += getSimilarity().sloppyFreq(matchLength);
|
||||||
more = spans.next();
|
more = spans.next();
|
||||||
}
|
} while (more && (doc == spans.doc()));
|
||||||
return more || (freq != 0);
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int doc() { return doc; }
|
public int doc() { return doc; }
|
||||||
|
|
|
@ -20,6 +20,10 @@ package org.apache.lucene.search.spans;
|
||||||
import org.apache.lucene.search.IndexSearcher;
|
import org.apache.lucene.search.IndexSearcher;
|
||||||
import org.apache.lucene.search.Query;
|
import org.apache.lucene.search.Query;
|
||||||
import org.apache.lucene.search.CheckHits;
|
import org.apache.lucene.search.CheckHits;
|
||||||
|
import org.apache.lucene.search.Similarity;
|
||||||
|
import org.apache.lucene.search.DefaultSimilarity;
|
||||||
|
import org.apache.lucene.search.Scorer;
|
||||||
|
import org.apache.lucene.search.Searcher;
|
||||||
import org.apache.lucene.store.RAMDirectory;
|
import org.apache.lucene.store.RAMDirectory;
|
||||||
import org.apache.lucene.index.IndexWriter;
|
import org.apache.lucene.index.IndexWriter;
|
||||||
import org.apache.lucene.index.Term;
|
import org.apache.lucene.index.Term;
|
||||||
|
@ -355,4 +359,34 @@ public class TestSpans extends LuceneTestCase {
|
||||||
tstNextSpans(spans, 11, 5, 6);
|
tstNextSpans(spans, 11, 5, 6);
|
||||||
assertFalse("final next", spans.next());
|
assertFalse("final next", spans.next());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testSpanScorerZeroSloppyFreq() throws Exception {
|
||||||
|
boolean ordered = true;
|
||||||
|
int slop = 1;
|
||||||
|
|
||||||
|
final Similarity sim = new DefaultSimilarity() {
|
||||||
|
public float sloppyFreq(int distance) {
|
||||||
|
return 0.0f;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
SpanNearQuery snq = new SpanNearQuery(
|
||||||
|
new SpanQuery[] {
|
||||||
|
makeSpanTermQuery("t1"),
|
||||||
|
makeSpanTermQuery("t2") },
|
||||||
|
slop,
|
||||||
|
ordered) {
|
||||||
|
public Similarity getSimilarity(Searcher s) {
|
||||||
|
return sim;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Scorer spanScorer = snq.weight(searcher).scorer(searcher.getIndexReader());
|
||||||
|
|
||||||
|
assertTrue("first doc", spanScorer.next());
|
||||||
|
assertEquals("first doc number", spanScorer.doc(), 11);
|
||||||
|
float score = spanScorer.score();
|
||||||
|
assertTrue("first doc score should be zero, " + score, score == 0.0f);
|
||||||
|
assertTrue("no second doc", ! spanScorer.next());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue