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 2011/01/08 23:46:22 UTC

svn commit: r1056829 - in /lucene/dev/branches/branch_3x: ./ lucene/ lucene/src/java/org/apache/lucene/index/ lucene/src/java/org/apache/lucene/search/ lucene/src/test/org/apache/lucene/index/ solr/

Author: rmuir
Date: Sat Jan  8 22:46:21 2011
New Revision: 1056829

URL: http://svn.apache.org/viewvc?rev=1056829&view=rev
Log:
LUCENE-1260: use the provided sim to encode norms

Modified:
    lucene/dev/branches/branch_3x/   (props changed)
    lucene/dev/branches/branch_3x/lucene/   (props changed)
    lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/index/NormsWriter.java
    lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/index/NormsWriterPerField.java
    lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/Similarity.java
    lucene/dev/branches/branch_3x/lucene/src/test/org/apache/lucene/index/TestNorms.java
    lucene/dev/branches/branch_3x/solr/   (props changed)

Modified: lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/index/NormsWriter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/index/NormsWriter.java?rev=1056829&r1=1056828&r2=1056829&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/index/NormsWriter.java (original)
+++ lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/index/NormsWriter.java Sat Jan  8 22:46:21 2011
@@ -37,7 +37,7 @@ import org.apache.lucene.search.Similari
 
 final class NormsWriter extends InvertedDocEndConsumer {
 
-  private static final byte defaultNorm = Similarity.getDefault().encodeNormValue(1.0f);
+  private final byte defaultNorm = Similarity.getDefault().encodeNormValue(1.0f);
   private FieldInfos fieldInfos;
   @Override
   public InvertedDocEndConsumerPerThread addThread(DocInverterPerThread docInverterPerThread) {

Modified: lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/index/NormsWriterPerField.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/index/NormsWriterPerField.java?rev=1056829&r1=1056828&r2=1056829&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/index/NormsWriterPerField.java (original)
+++ lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/index/NormsWriterPerField.java Sat Jan  8 22:46:21 2011
@@ -73,7 +73,7 @@ final class NormsWriterPerField extends 
         norms = ArrayUtil.grow(norms, 1+upto);
       }
       final float norm = docState.similarity.computeNorm(fieldInfo.name, fieldState);
-      norms[upto] = Similarity.getDefault().encodeNormValue(norm);
+      norms[upto] = docState.similarity.encodeNormValue(norm);
       docIDs[upto] = docState.docID;
       upto++;
     }

Modified: lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/Similarity.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/Similarity.java?rev=1056829&r1=1056828&r2=1056829&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/Similarity.java (original)
+++ lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/Similarity.java Sat Jan  8 22:46:21 2011
@@ -575,6 +575,11 @@ public abstract class Similarity impleme
   }
 
   /** Decodes a normalization factor stored in an index.
+   * <p>
+   * <b>WARNING: If you override this method, you should change the default
+   *    Similarity to your implementation with {@link Similarity#setDefault(Similarity)}. 
+   *    Otherwise, your method may not always be called, especially if you omit norms 
+   *    for some fields.</b>
    * @see #encodeNormValue(float)
    */
   public float decodeNormValue(byte b) {
@@ -678,7 +683,11 @@ public abstract class Similarity impleme
    * are rounded down to the largest representable value.  Positive values too
    * small to represent are rounded up to the smallest positive representable
    * value.
-   *
+   * <p>
+   * <b>WARNING: If you override this method, you should change the default
+   * Similarity to your implementation with {@link Similarity#setDefault(Similarity)}. 
+   * Otherwise, your method may not always be called, especially if you omit norms 
+   * for some fields.</b>
    * @see org.apache.lucene.document.Field#setBoost(float)
    * @see org.apache.lucene.util.SmallFloat
    */

Modified: lucene/dev/branches/branch_3x/lucene/src/test/org/apache/lucene/index/TestNorms.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/src/test/org/apache/lucene/index/TestNorms.java?rev=1056829&r1=1056828&r2=1056829&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/src/test/org/apache/lucene/index/TestNorms.java (original)
+++ lucene/dev/branches/branch_3x/lucene/src/test/org/apache/lucene/index/TestNorms.java Sat Jan  8 22:46:21 2011
@@ -22,6 +22,7 @@ import java.util.ArrayList;
 import java.util.Random;
 
 import org.apache.lucene.analysis.Analyzer;
+import org.apache.lucene.analysis.MockAnalyzer;
 import org.apache.lucene.analysis.standard.StandardAnalyzer;
 import org.apache.lucene.document.Document;
 import org.apache.lucene.document.Field;
@@ -230,4 +231,52 @@ public class TestNorms extends LuceneTes
     return norm;
   }
   
+  class CustomNormEncodingSimilarity extends DefaultSimilarity {
+    @Override
+    public byte encodeNormValue(float f) {
+      return (byte) f;
+    }
+    
+    @Override
+    public float decodeNormValue(byte b) {
+      return (float) b;
+    }
+
+    @Override
+    public float computeNorm(String field, FieldInvertState state) {
+      return (float) state.getLength();
+    }
+  }
+  
+  // LUCENE-1260
+  public void testCustomEncoder() throws Exception {
+    Directory dir = newDirectory();
+    IndexWriterConfig config = newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer());
+    config.setSimilarity(new CustomNormEncodingSimilarity());
+    RandomIndexWriter writer = new RandomIndexWriter(random, dir, config);
+    Document doc = new Document();
+    Field foo = newField("foo", "", Field.Store.NO, Field.Index.ANALYZED);
+    Field bar = newField("bar", "", Field.Store.NO, Field.Index.ANALYZED);
+    doc.add(foo);
+    doc.add(bar);
+    
+    for (int i = 0; i < 100; i++) {
+      bar.setValue("singleton");
+      writer.addDocument(doc);
+    }
+    
+    IndexReader reader = writer.getReader();
+    writer.close();
+    
+    byte fooNorms[] = reader.norms("foo");
+    for (int i = 0; i < reader.maxDoc(); i++)
+      assertEquals(0, fooNorms[i]);
+    
+    byte barNorms[] = reader.norms("bar");
+    for (int i = 0; i < reader.maxDoc(); i++)
+      assertEquals(1, barNorms[i]);
+    
+    reader.close();
+    dir.close();
+  }
 }