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/02/18 16:48:58 UTC

svn commit: r1245948 - in /lucene/dev/branches/branch_3x: ./ lucene/ lucene/core/src/java/org/apache/lucene/index/ lucene/core/src/test/org/apache/lucene/document/ solr/ solr/core/ solr/core/src/java/org/apache/solr/update/ solr/core/src/test/org/apach...

Author: rmuir
Date: Sat Feb 18 15:48:57 2012
New Revision: 1245948

URL: http://svn.apache.org/viewvc?rev=1245948&view=rev
Log:
LUCENE-3785: throw an exception if you set an index-time boost on a field that omits norms

Modified:
    lucene/dev/branches/branch_3x/   (props changed)
    lucene/dev/branches/branch_3x/lucene/   (props changed)
    lucene/dev/branches/branch_3x/lucene/CHANGES.txt
    lucene/dev/branches/branch_3x/lucene/core/src/java/org/apache/lucene/index/DocInverterPerField.java
    lucene/dev/branches/branch_3x/lucene/core/src/test/org/apache/lucene/document/TestDocument.java
    lucene/dev/branches/branch_3x/solr/   (props changed)
    lucene/dev/branches/branch_3x/solr/core/   (props changed)
    lucene/dev/branches/branch_3x/solr/core/src/java/org/apache/solr/update/DocumentBuilder.java
    lucene/dev/branches/branch_3x/solr/core/src/test/org/apache/solr/handler/XsltUpdateRequestHandlerTest.java

Modified: lucene/dev/branches/branch_3x/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/CHANGES.txt?rev=1245948&r1=1245947&r2=1245948&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/CHANGES.txt (original)
+++ lucene/dev/branches/branch_3x/lucene/CHANGES.txt Sat Feb 18 15:48:57 2012
@@ -70,6 +70,13 @@ Changes in backwards compatibility polic
   IndexReader.lastModified and getCurrentVersion (Andrzej Bialecki,
   Robert Muir, Mike McCandless)
   
+Changes in Runtime Behavior
+
+* LUCENE-3796: Throw an exception if you try to set an index-time
+  boost on a field that omits norms. Because the index-time boost
+  is multiplied into the norm, previously your boost would be 
+  silently discarded.  (Robert Muir)
+  
 Security fixes
 
 * LUCENE-3588: Try harder to prevent SIGSEGV on cloned MMapIndexInputs:

Modified: lucene/dev/branches/branch_3x/lucene/core/src/java/org/apache/lucene/index/DocInverterPerField.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/core/src/java/org/apache/lucene/index/DocInverterPerField.java?rev=1245948&r1=1245947&r2=1245948&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/core/src/java/org/apache/lucene/index/DocInverterPerField.java (original)
+++ lucene/dev/branches/branch_3x/lucene/core/src/java/org/apache/lucene/index/DocInverterPerField.java Sat Feb 18 15:48:57 2012
@@ -79,6 +79,12 @@ final class DocInverterPerField extends 
       // tokenized.
       if (field.isIndexed() && doInvert) {
         
+        final float boost = field.getBoost();
+        // if the field omits norms, the boost cannot be indexed.
+        if (field.getOmitNorms() && boost != 1.0f) {
+          throw new UnsupportedOperationException("You cannot set an index-time boost: norms are omitted for field '" + field.name() + "'");
+        }
+        
         if (i > 0)
           fieldState.position += docState.analyzer == null ? 0 : docState.analyzer.getPositionIncrementGap(fieldInfo.name);
 
@@ -194,7 +200,7 @@ final class DocInverterPerField extends 
         }
 
         fieldState.offset += docState.analyzer == null ? 0 : docState.analyzer.getOffsetGap(field);
-        fieldState.boost *= field.getBoost();
+        fieldState.boost *= boost;
       }
 
       // LUCENE-2387: don't hang onto the field, so GC can

Modified: lucene/dev/branches/branch_3x/lucene/core/src/test/org/apache/lucene/document/TestDocument.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/core/src/test/org/apache/lucene/document/TestDocument.java?rev=1245948&r1=1245947&r2=1245948&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/core/src/test/org/apache/lucene/document/TestDocument.java (original)
+++ lucene/dev/branches/branch_3x/lucene/core/src/test/org/apache/lucene/document/TestDocument.java Sat Feb 18 15:48:57 2012
@@ -1,6 +1,9 @@
 package org.apache.lucene.document;
 
+import org.apache.lucene.analysis.MockAnalyzer;
 import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.IndexWriter;
+import org.apache.lucene.index.IndexWriterConfig;
 import org.apache.lucene.index.RandomIndexWriter;
 import org.apache.lucene.index.Term;
 import org.apache.lucene.search.IndexSearcher;
@@ -279,4 +282,33 @@ public class TestDocument extends Lucene
       // expected
     }
   }
+  
+  public void testBoost() throws Exception {
+    Directory dir = newDirectory();
+    IndexWriterConfig iwc = new IndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(random));
+    iwc.setMergePolicy(newLogMergePolicy());
+    IndexWriter iw = new IndexWriter(dir, iwc);
+    Document doc = new Document();
+    doc.add(new Field("field1", "sometext", Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS));
+    doc.add(new Field("field2", "sometext", Field.Store.NO, Field.Index.ANALYZED));
+    doc.add(new Field("foo", "bar", Field.Store.NO, Field.Index.NOT_ANALYZED_NO_NORMS));
+    iw.addDocument(doc); // add an 'ok' document
+    try {
+      doc = new Document();
+      // try to boost with norms omitted
+      Field field = new Field("foo", "baz", Field.Store.NO, Field.Index.NOT_ANALYZED_NO_NORMS);
+      field.setBoost(5.0f);
+      doc.add(field);
+      iw.addDocument(doc);
+      fail("didn't get any exception, boost silently discarded");
+    } catch (UnsupportedOperationException expected) {
+      // expected
+    }
+    IndexReader ir = IndexReader.open(iw, false);
+    assertEquals(1, ir.numDocs());
+    assertEquals("sometext", ir.document(0).get("field1"));
+    ir.close();
+    iw.close();
+    dir.close();
+  }
 }

Modified: lucene/dev/branches/branch_3x/solr/core/src/java/org/apache/solr/update/DocumentBuilder.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/solr/core/src/java/org/apache/solr/update/DocumentBuilder.java?rev=1245948&r1=1245947&r2=1245948&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/solr/core/src/java/org/apache/solr/update/DocumentBuilder.java (original)
+++ lucene/dev/branches/branch_3x/solr/core/src/java/org/apache/solr/update/DocumentBuilder.java Sat Feb 18 15:48:57 2012
@@ -248,6 +248,11 @@ public class DocumentBuilder {
               sfield.getName() + ": " +field.getValue() );
       }
       
+      if (sfield != null && sfield.omitNorms() && boost != 1.0F) {
+        throw new SolrException( SolrException.ErrorCode.BAD_REQUEST,
+            "ERROR: "+getID(doc, schema)+"cannot set an index-time boost, norms are omitted for field " + 
+            sfield.getName() + ": " +field.getValue() );
+      }
 
       // load each field value
       boolean hasField = false;

Modified: lucene/dev/branches/branch_3x/solr/core/src/test/org/apache/solr/handler/XsltUpdateRequestHandlerTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/solr/core/src/test/org/apache/solr/handler/XsltUpdateRequestHandlerTest.java?rev=1245948&r1=1245947&r2=1245948&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/solr/core/src/test/org/apache/solr/handler/XsltUpdateRequestHandlerTest.java (original)
+++ lucene/dev/branches/branch_3x/solr/core/src/test/org/apache/solr/handler/XsltUpdateRequestHandlerTest.java Sat Feb 18 15:48:57 2012
@@ -57,7 +57,7 @@ public class XsltUpdateRequestHandlerTes
     String xml = 
       "<random>" +
       " <document>" +
-      "  <node name=\"id\" enhance=\"2.2\" value=\"12345\"/>" +
+      "  <node name=\"id\" value=\"12345\"/>" +
       "  <node name=\"name\" value=\"kitten\"/>" +
       "  <node name=\"text\" enhance=\"3\" value=\"some other day\"/>" +
       "  <node name=\"title\" enhance=\"4\" value=\"A story\"/>" +