Skip to content

Commit 5939cd4

Browse files
aditya-agrawalChristoph Büscher
authored and
Christoph Büscher
committed
Avoid NPE in more_like_this when field has zero tokens (#30365)
Fixes and edge case when using `more_like_this` where TermVectorsWriter could throw an NPE when a field produced zero tokens after analysis. This changes the implementation to use an empty list of tokens in this case. Closes #30148
1 parent 955667c commit 5939cd4

File tree

3 files changed

+36
-0
lines changed

3 files changed

+36
-0
lines changed

docs/CHANGELOG.asciidoc

+2
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,8 @@ searching ({pull}30338[#30338])
115115
[float]
116116
=== Bug Fixes
117117

118+
Fix NPE in 'more_like_this' when field has zero tokens ({pull}30365[#30365])
119+
118120
Do not ignore request analysis/similarity settings on index resize operations when the source index already contains such settings ({pull}30216[#30216])
119121

120122
Fix NPE when CumulativeSum agg encounters null value/empty bucket ({pull}29641[#29641])

server/src/main/java/org/elasticsearch/action/termvectors/TermVectorsWriter.java

+4
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,10 @@ void setFields(Fields termVectorsByField, Set<String> selectedFields, EnumSet<Fl
7070
Terms topLevelTerms = topLevelFields.terms(field);
7171

7272
// if no terms found, take the retrieved term vector fields for stats
73+
if (fieldTermVector == null) {
74+
fieldTermVector = EMPTY_TERMS;
75+
}
76+
7377
if (topLevelTerms == null) {
7478
topLevelTerms = EMPTY_TERMS;
7579
}

server/src/test/java/org/elasticsearch/search/morelikethis/MoreLikeThisIT.java

+30
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,36 @@ public void testSimpleMoreLikeThis() throws Exception {
9191
assertHitCount(response, 1L);
9292
}
9393

94+
//Issue #30148
95+
public void testMoreLikeThisForZeroTokensInOneOfTheAnalyzedFields() throws Exception {
96+
CreateIndexRequestBuilder createIndexRequestBuilder = prepareCreate("test")
97+
.addMapping("type", jsonBuilder()
98+
.startObject().startObject("type")
99+
.startObject("properties")
100+
.startObject("myField").field("type", "text").endObject()
101+
.startObject("empty").field("type", "text").endObject()
102+
.endObject()
103+
.endObject().endObject());
104+
105+
assertAcked(createIndexRequestBuilder);
106+
107+
ensureGreen();
108+
109+
client().index(indexRequest("test").type("type").id("1").source(jsonBuilder().startObject()
110+
.field("myField", "and_foo").field("empty", "").endObject())).actionGet();
111+
client().index(indexRequest("test").type("type").id("2").source(jsonBuilder().startObject()
112+
.field("myField", "and_foo").field("empty", "").endObject())).actionGet();
113+
114+
client().admin().indices().refresh(refreshRequest()).actionGet();
115+
116+
SearchResponse searchResponse = client().prepareSearch().setQuery(
117+
moreLikeThisQuery(new String[]{"myField", "empty"}, null, new Item[]{new Item("test", "type", "1")})
118+
.minTermFreq(1).minDocFreq(1)
119+
).get();
120+
121+
assertHitCount(searchResponse, 1L);
122+
}
123+
94124
public void testSimpleMoreLikeOnLongField() throws Exception {
95125
logger.info("Creating index test");
96126
assertAcked(prepareCreate("test")

0 commit comments

Comments
 (0)