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 2012/08/08 17:44:54 UTC
svn commit: r1370816 - in /lucene/dev/branches/lucene_solr_3_6: ./ lucene/
lucene/core/src/ lucene/core/src/java/org/apache/lucene/search/
lucene/core/src/test/org/apache/lucene/search/
Author: rmuir
Date: Wed Aug 8 15:44:54 2012
New Revision: 1370816
URL: http://svn.apache.org/viewvc?rev=1370816&view=rev
Log:
LUCENE-4297: BooleanScorer2 sometimes multiplies coord() twice into the score
Modified:
lucene/dev/branches/lucene_solr_3_6/ (props changed)
lucene/dev/branches/lucene_solr_3_6/lucene/ (props changed)
lucene/dev/branches/lucene_solr_3_6/lucene/CHANGES.txt
lucene/dev/branches/lucene_solr_3_6/lucene/core/src/ (props changed)
lucene/dev/branches/lucene_solr_3_6/lucene/core/src/java/org/apache/lucene/search/BooleanScorer2.java
lucene/dev/branches/lucene_solr_3_6/lucene/core/src/java/org/apache/lucene/search/ConjunctionScorer.java
lucene/dev/branches/lucene_solr_3_6/lucene/core/src/test/org/apache/lucene/search/TestBoolean2.java
Modified: lucene/dev/branches/lucene_solr_3_6/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_3_6/lucene/CHANGES.txt?rev=1370816&r1=1370815&r2=1370816&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_3_6/lucene/CHANGES.txt (original)
+++ lucene/dev/branches/lucene_solr_3_6/lucene/CHANGES.txt Wed Aug 8 15:44:54 2012
@@ -17,6 +17,12 @@ Bug Fixes:
ArrayIndexOutOfBoundsException inside ByteBlockPool (Robert Muir,
Mike McCandless)
+* LUCENE-4297: BooleanScorer2 would multiply the coord() factor
+ twice for conjunctions: for most users this is no problem, but
+ if you had a customized Similarity that returned something other
+ than 1 when overlap == maxOverlap (always the case for conjunctions),
+ then the score would be incorrect. (Pascal Chollet, Robert Muir)
+
======================= Lucene 3.6.1 =======================
More information about this release, including any errata related to the
release notes, upgrade instructions, or other changes may be found online at:
Modified: lucene/dev/branches/lucene_solr_3_6/lucene/core/src/java/org/apache/lucene/search/BooleanScorer2.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_3_6/lucene/core/src/java/org/apache/lucene/search/BooleanScorer2.java?rev=1370816&r1=1370815&r2=1370816&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_3_6/lucene/core/src/java/org/apache/lucene/search/BooleanScorer2.java (original)
+++ lucene/dev/branches/lucene_solr_3_6/lucene/core/src/java/org/apache/lucene/search/BooleanScorer2.java Wed Aug 8 15:44:54 2012
@@ -175,7 +175,7 @@ class BooleanScorer2 extends Scorer {
List<Scorer> requiredScorers) throws IOException {
// each scorer from the list counted as a single matcher
final int requiredNrMatchers = requiredScorers.size();
- return new ConjunctionScorer(weight, disableCoord ? 1.0f : similarity.coord(requiredScorers.size(), requiredScorers.size()), requiredScorers) {
+ return new ConjunctionScorer(weight, requiredScorers) {
private int lastScoredDoc = -1;
// Save the score of lastScoredDoc, so that we don't compute it more than
// once in score().
@@ -201,7 +201,7 @@ class BooleanScorer2 extends Scorer {
private Scorer dualConjunctionSumScorer(boolean disableCoord,
Similarity similarity,
Scorer req1, Scorer req2) throws IOException { // non counting.
- return new ConjunctionScorer(weight, disableCoord ? 1.0f : similarity.coord(2, 2), req1, req2);
+ return new ConjunctionScorer(weight, req1, req2);
// All scorers match, so defaultSimilarity always has 1 as
// the coordination factor.
// Therefore the sum of the scores of two scorers
Modified: lucene/dev/branches/lucene_solr_3_6/lucene/core/src/java/org/apache/lucene/search/ConjunctionScorer.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_3_6/lucene/core/src/java/org/apache/lucene/search/ConjunctionScorer.java?rev=1370816&r1=1370815&r2=1370816&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_3_6/lucene/core/src/java/org/apache/lucene/search/ConjunctionScorer.java (original)
+++ lucene/dev/branches/lucene_solr_3_6/lucene/core/src/java/org/apache/lucene/search/ConjunctionScorer.java Wed Aug 8 15:44:54 2012
@@ -26,17 +26,15 @@ import java.util.Comparator;
class ConjunctionScorer extends Scorer {
private final Scorer[] scorers;
- private final float coord;
private int lastDoc = -1;
- public ConjunctionScorer(Weight weight, float coord, Collection<Scorer> scorers) throws IOException {
- this(weight, coord, scorers.toArray(new Scorer[scorers.size()]));
+ public ConjunctionScorer(Weight weight, Collection<Scorer> scorers) throws IOException {
+ this(weight, scorers.toArray(new Scorer[scorers.size()]));
}
- public ConjunctionScorer(Weight weight, float coord, Scorer... scorers) throws IOException {
+ public ConjunctionScorer(Weight weight, Scorer... scorers) throws IOException {
super(weight);
this.scorers = scorers;
- this.coord = coord;
for (int i = 0; i < scorers.length; i++) {
if (scorers[i].nextDoc() == NO_MORE_DOCS) {
@@ -134,7 +132,7 @@ class ConjunctionScorer extends Scorer {
for (int i = 0; i < scorers.length; i++) {
sum += scorers[i].score();
}
- return sum * coord;
+ return sum;
}
@Override
Modified: lucene/dev/branches/lucene_solr_3_6/lucene/core/src/test/org/apache/lucene/search/TestBoolean2.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_3_6/lucene/core/src/test/org/apache/lucene/search/TestBoolean2.java?rev=1370816&r1=1370815&r2=1370816&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_3_6/lucene/core/src/test/org/apache/lucene/search/TestBoolean2.java (original)
+++ lucene/dev/branches/lucene_solr_3_6/lucene/core/src/test/org/apache/lucene/search/TestBoolean2.java Wed Aug 8 15:44:54 2012
@@ -226,6 +226,14 @@ public class TestBoolean2 extends Lucene
searcher.setSimilarity(oldSimilarity);
}
}
+
+ // die serialization, die
+ static class FunkySimilarity extends DefaultSimilarity {
+ @Override
+ public float coord(int overlap, int maxOverlap) {
+ return overlap / ((float)maxOverlap + 1);
+ }
+ }
@Test
public void testRandomQueries() throws Exception {
@@ -247,6 +255,13 @@ public class TestBoolean2 extends Lucene
Sort sort = Sort.INDEXORDER;
QueryUtils.check(random, q1,searcher);
+ final Similarity oldSim = searcher.getSimilarity();
+ try {
+ searcher.setSimilarity(new FunkySimilarity());
+ QueryUtils.check(random, q1,searcher);
+ } finally {
+ searcher.setSimilarity(oldSim);
+ }
TopFieldCollector collector = TopFieldCollector.create(sort, 1000,
false, true, true, true);