You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by mi...@apache.org on 2015/04/25 00:19:41 UTC

svn commit: r1675965 - in /lucene/dev/trunk/lucene: CHANGES.txt highlighter/src/java/org/apache/lucene/search/postingshighlight/PostingsHighlighter.java highlighter/src/test/org/apache/lucene/search/postingshighlight/TestPostingsHighlighter.java

Author: mikemccand
Date: Fri Apr 24 22:19:40 2015
New Revision: 1675965

URL: http://svn.apache.org/r1675965
Log:
LUCENE-6449: fix NullPointerException when one segment is missing the highlighted field in its postings

Modified:
    lucene/dev/trunk/lucene/CHANGES.txt
    lucene/dev/trunk/lucene/highlighter/src/java/org/apache/lucene/search/postingshighlight/PostingsHighlighter.java
    lucene/dev/trunk/lucene/highlighter/src/test/org/apache/lucene/search/postingshighlight/TestPostingsHighlighter.java

Modified: lucene/dev/trunk/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/CHANGES.txt?rev=1675965&r1=1675964&r2=1675965&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/CHANGES.txt (original)
+++ lucene/dev/trunk/lucene/CHANGES.txt Fri Apr 24 22:19:40 2015
@@ -130,6 +130,10 @@ Bug Fixes
   of replacing it with a synonym, when expand=true and there is no
   explicit mapping (Ian Ribas, Robert Muir, Mike McCandless)
 
+* LUCENE-6449: Don't throw NullPointerException if some segments are
+  missing the field being highlighted, in PostingsHighlighter (Roman
+  Khmelichek via Mike McCandless)
+
 API Changes
 
 * LUCENE-6377: SearcherFactory#newSearcher now accepts the previous reader

Modified: lucene/dev/trunk/lucene/highlighter/src/java/org/apache/lucene/search/postingshighlight/PostingsHighlighter.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/highlighter/src/java/org/apache/lucene/search/postingshighlight/PostingsHighlighter.java?rev=1675965&r1=1675964&r2=1675965&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/highlighter/src/java/org/apache/lucene/search/postingshighlight/PostingsHighlighter.java (original)
+++ lucene/dev/trunk/lucene/highlighter/src/java/org/apache/lucene/search/postingshighlight/PostingsHighlighter.java Fri Apr 24 22:19:40 2015
@@ -505,12 +505,16 @@ public class PostingsHighlighter {
       // if the segment has changed, we must initialize new enums.
       if (leaf != lastLeaf) {
         Terms t = r.terms(field);
-        if (!t.hasOffsets()) {
-          // no offsets available
-          throw new IllegalArgumentException("field '" + field + "' was indexed without offsets, cannot highlight");
+        if (t != null) {
+          if (!t.hasOffsets()) {
+            // no offsets available
+            throw new IllegalArgumentException("field '" + field + "' was indexed without offsets, cannot highlight");
+          }
+          termsEnum = t.iterator();
+          postings = new PostingsEnum[terms.length];
+        } else {
+          termsEnum = null;
         }
-        termsEnum = t.iterator();
-        postings = new PostingsEnum[terms.length];
       }
       if (termsEnum == null) {
         continue; // no terms for this field, nothing to do

Modified: lucene/dev/trunk/lucene/highlighter/src/test/org/apache/lucene/search/postingshighlight/TestPostingsHighlighter.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/highlighter/src/test/org/apache/lucene/search/postingshighlight/TestPostingsHighlighter.java?rev=1675965&r1=1675964&r2=1675965&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/highlighter/src/test/org/apache/lucene/search/postingshighlight/TestPostingsHighlighter.java (original)
+++ lucene/dev/trunk/lucene/highlighter/src/test/org/apache/lucene/search/postingshighlight/TestPostingsHighlighter.java Fri Apr 24 22:19:40 2015
@@ -31,6 +31,7 @@ import org.apache.lucene.analysis.MockTo
 import org.apache.lucene.document.Document;
 import org.apache.lucene.document.Field;
 import org.apache.lucene.document.FieldType;
+import org.apache.lucene.document.StoredField;
 import org.apache.lucene.document.StringField;
 import org.apache.lucene.document.TextField;
 import org.apache.lucene.index.IndexOptions;
@@ -42,6 +43,7 @@ import org.apache.lucene.index.Term;
 import org.apache.lucene.search.BooleanClause;
 import org.apache.lucene.search.BooleanQuery;
 import org.apache.lucene.search.IndexSearcher;
+import org.apache.lucene.search.MatchAllDocsQuery;
 import org.apache.lucene.search.PhraseQuery;
 import org.apache.lucene.search.Query;
 import org.apache.lucene.search.ScoreDoc;
@@ -1118,4 +1120,39 @@ public class TestPostingsHighlighter ext
     ir.close();
     dir.close();
   }
+
+  public void testFieldSometimesMissingFromSegment() throws Exception {
+    Directory dir = newDirectory();
+    IndexWriterConfig iwc = newIndexWriterConfig(new MockAnalyzer(random()));
+    iwc.setMergePolicy(newLogMergePolicy());
+    RandomIndexWriter iw = new RandomIndexWriter(random(), dir, iwc);
+    
+    FieldType offsetsType = new FieldType(TextField.TYPE_STORED);
+    offsetsType.setIndexOptions(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS);
+    Field body = new Field("body", "foo", offsetsType);
+    Document doc = new Document();
+    doc.add(body);
+    iw.addDocument(doc);
+
+    // Make a 2nd segment where body is only stored:
+    iw.commit();
+    doc = new Document();
+    doc.add(new StoredField("body", "foo"));
+    iw.addDocument(doc);
+    
+    IndexReader ir = iw.getReader();
+    iw.close();
+    
+    IndexSearcher searcher = newSearcher(ir);
+    PostingsHighlighter highlighter = new PostingsHighlighter();
+    Query query = new MatchAllDocsQuery();
+    TopDocs topDocs = searcher.search(query, 10, Sort.INDEXORDER);
+    assertEquals(2, topDocs.totalHits);
+    String snippets[] = highlighter.highlight("body", query, searcher, topDocs);
+    assertEquals(2, snippets.length);
+    assertEquals("foo", snippets[0]);
+    assertNull(snippets[1]);
+    ir.close();
+    dir.close();
+  }
 }