You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-commits@lucene.apache.org by bu...@apache.org on 2007/05/31 01:09:26 UTC

svn commit: r542968 - in /lucene/java/trunk: CHANGES.txt src/java/org/apache/lucene/search/FilteredQuery.java src/test/org/apache/lucene/search/TestFilteredQuery.java src/test/org/apache/lucene/search/TestSimpleExplanations.java

Author: buschmi
Date: Wed May 30 16:09:25 2007
New Revision: 542968

URL: http://svn.apache.org/viewvc?view=rev&rev=542968
Log:
LUCENE-698: FilteredQuery now takes the query boost into account for scoring.

Modified:
    lucene/java/trunk/CHANGES.txt
    lucene/java/trunk/src/java/org/apache/lucene/search/FilteredQuery.java
    lucene/java/trunk/src/test/org/apache/lucene/search/TestFilteredQuery.java
    lucene/java/trunk/src/test/org/apache/lucene/search/TestSimpleExplanations.java

Modified: lucene/java/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/java/trunk/CHANGES.txt?view=diff&rev=542968&r1=542967&r2=542968
==============================================================================
--- lucene/java/trunk/CHANGES.txt (original)
+++ lucene/java/trunk/CHANGES.txt Wed May 30 16:09:25 2007
@@ -147,6 +147,9 @@
     anymore and ignored, but re-thrown. Some javadoc improvements.
     (Daniel Naber)
 
+19. LUCENE-698: FilteredQuery now takes the query boost into account for 
+    scoring. (Michael Busch)
+
 New features
 
  1. LUCENE-759: Added two n-gram-producing TokenFilters.

Modified: lucene/java/trunk/src/java/org/apache/lucene/search/FilteredQuery.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/lucene/search/FilteredQuery.java?view=diff&rev=542968&r1=542967&r2=542968
==============================================================================
--- lucene/java/trunk/src/java/org/apache/lucene/search/FilteredQuery.java (original)
+++ lucene/java/trunk/src/java/org/apache/lucene/search/FilteredQuery.java Wed May 30 16:09:25 2007
@@ -66,13 +66,20 @@
     final Weight weight = query.createWeight (searcher);
     final Similarity similarity = query.getSimilarity(searcher);
     return new Weight() {
-
+      private float value;
+        
       // pass these methods through to enclosed query's weight
-      public float getValue() { return weight.getValue(); }
-      public float sumOfSquaredWeights() throws IOException { return weight.sumOfSquaredWeights(); }
-      public void normalize (float v) { weight.normalize(v); }
+      public float getValue() { return value; }
+      public float sumOfSquaredWeights() throws IOException { 
+        return weight.sumOfSquaredWeights() * getBoost() * getBoost(); 
+      }
+      public void normalize (float v) { 
+        weight.normalize(v);
+        value = weight.getValue() * getBoost();
+      }
       public Explanation explain (IndexReader ir, int i) throws IOException {
         Explanation inner = weight.explain (ir, i);
+        inner.setValue(getBoost() * inner.getValue());
         Filter f = FilteredQuery.this.filter;
         BitSet matches = f.bits(ir);
         if (matches.get(i))
@@ -121,11 +128,13 @@
             return true;
            }
 
-          public float score() throws IOException { return scorer.score(); }
+          public float score() throws IOException { return getBoost() * scorer.score(); }
 
           // add an explanation about whether the document was filtered
           public Explanation explain (int i) throws IOException {
             Explanation exp = scorer.explain (i);
+            exp.setValue(getBoost() * exp.getValue());
+            
             if (bitset.get(i))
               exp.setDescription ("allowed by filter: "+exp.getDescription());
             else

Modified: lucene/java/trunk/src/test/org/apache/lucene/search/TestFilteredQuery.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/test/org/apache/lucene/search/TestFilteredQuery.java?view=diff&rev=542968&r1=542967&r2=542968
==============================================================================
--- lucene/java/trunk/src/test/org/apache/lucene/search/TestFilteredQuery.java (original)
+++ lucene/java/trunk/src/test/org/apache/lucene/search/TestFilteredQuery.java Wed May 30 16:09:25 2007
@@ -24,6 +24,7 @@
 import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.Term;
+import org.apache.lucene.search.BooleanClause.Occur;
 import org.apache.lucene.store.RAMDirectory;
 import java.util.BitSet;
 
@@ -116,7 +117,48 @@
     filteredquery = new FilteredQuery (new TermQuery (new Term ("field", "y")), filter);
     hits = searcher.search (filteredquery);
     assertEquals (0, hits.length());
-    QueryUtils.check(filteredquery,searcher);    
+    QueryUtils.check(filteredquery,searcher);
+    
+    // test boost
+    Filter f = new Filter() {
+      public BitSet bits (IndexReader reader) {
+        BitSet bitset = new BitSet(5);
+        bitset.set(0, 5);
+        return bitset;
+      }
+    };
+    
+    float boost = 2.5f;
+    BooleanQuery bq1 = new BooleanQuery();
+    TermQuery tq = new TermQuery (new Term ("field", "one"));
+    tq.setBoost(boost);
+    bq1.add(tq, Occur.MUST);
+    bq1.add(new TermQuery (new Term ("field", "five")), Occur.MUST);
+    
+    BooleanQuery bq2 = new BooleanQuery();
+    tq = new TermQuery (new Term ("field", "one"));
+    filteredquery = new FilteredQuery(tq, f);
+    filteredquery.setBoost(boost);
+    bq2.add(filteredquery, Occur.MUST);
+    bq2.add(new TermQuery (new Term ("field", "five")), Occur.MUST);
+    assertScoreEquals(bq1, bq2);
+    
+    assertEquals(boost, filteredquery.getBoost(), 0);
+    assertEquals(1.0f, tq.getBoost(), 0); // the boost value of the underlying query shouldn't have changed 
+  }
+  
+  /**
+   * Tests whether the scores of the two queries are the same.
+   */
+  public void assertScoreEquals(Query q1, Query q2) throws Exception {
+    Hits hits1 = searcher.search (q1);
+    Hits hits2 = searcher.search (q2);
+      
+    assertEquals(hits1.length(), hits2.length());
+    
+    for (int i = 0; i < hits1.length(); i++) {
+      assertEquals(hits1.score(i), hits2.score(i), 0.0000001f);
+    }
   }
 
   /**
@@ -145,4 +187,5 @@
     QueryUtils.check(query,searcher);    
   }
 }
+
 

Modified: lucene/java/trunk/src/test/org/apache/lucene/search/TestSimpleExplanations.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/test/org/apache/lucene/search/TestSimpleExplanations.java?view=diff&rev=542968&r1=542967&r2=542968
==============================================================================
--- lucene/java/trunk/src/test/org/apache/lucene/search/TestSimpleExplanations.java (original)
+++ lucene/java/trunk/src/test/org/apache/lucene/search/TestSimpleExplanations.java Wed May 30 16:09:25 2007
@@ -119,12 +119,6 @@
     q.setBoost(1000);
     qtest(q, new int[] {3});
   }
-  public void testFQ7() throws Exception {
-    Query q = new FilteredQuery(qp.parse("xx"),
-                                new ItemizedFilter(new int[] {1,3}));
-    q.setBoost(0);
-    qtest(q, new int[] {3});
-  }
 
   /* ConstantScoreQueries */