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();
+ }
}