inner_hits: Skip adding a parent field to nested documents.

Otherwise an empty string get added as _parent field.

Closes #21503
This commit is contained in:
Martijn van Groningen 2016-11-14 07:27:02 +01:00
parent c7bd4f3454
commit 8a3a885058
2 changed files with 23 additions and 2 deletions

View File

@ -47,6 +47,11 @@ public final class ParentFieldSubFetchPhase implements FetchSubPhase {
} }
String parentId = getParentId(parentFieldMapper, hitContext.reader(), hitContext.docId()); String parentId = getParentId(parentFieldMapper, hitContext.reader(), hitContext.docId());
if (parentId == null) {
// hit has no _parent field. Can happen for nested inner hits if parent hit is a p/c document.
return;
}
Map<String, SearchHitField> fields = hitContext.hit().fieldsOrNull(); Map<String, SearchHitField> fields = hitContext.hit().fieldsOrNull();
if (fields == null) { if (fields == null) {
fields = new HashMap<>(); fields = new HashMap<>();
@ -59,8 +64,7 @@ public final class ParentFieldSubFetchPhase implements FetchSubPhase {
try { try {
SortedDocValues docValues = reader.getSortedDocValues(fieldMapper.name()); SortedDocValues docValues = reader.getSortedDocValues(fieldMapper.name());
BytesRef parentId = docValues.get(docId); BytesRef parentId = docValues.get(docId);
assert parentId.length > 0; return parentId.length > 0 ? parentId.utf8ToString() : null;
return parentId.utf8ToString();
} catch (IOException e) { } catch (IOException e) {
throw ExceptionsHelper.convertToElastic(e); throw ExceptionsHelper.convertToElastic(e);
} }

View File

@ -995,4 +995,21 @@ public class InnerHitsIT extends ESIntegTestCase {
equalTo("fox ate rabbit x y z")); equalTo("fox ate rabbit x y z"));
} }
public void testNestedInnerHitWrappedInParentChildInnerhit() throws Exception {
assertAcked(prepareCreate("test").addMapping("child_type", "_parent", "type=parent_type", "nested_type", "type=nested"));
client().prepareIndex("test", "parent_type", "1").setSource("key", "value").get();
client().prepareIndex("test", "child_type", "2").setParent("1").setSource("nested_type", Collections.singletonMap("key", "value"))
.get();
refresh();
SearchResponse response = client().prepareSearch("test")
.setQuery(boolQuery().must(matchQuery("key", "value"))
.should(hasChildQuery("child_type", nestedQuery("nested_type", matchAllQuery(), ScoreMode.None)
.innerHit(new InnerHitBuilder()), ScoreMode.None).innerHit(new InnerHitBuilder())))
.get();
assertHitCount(response, 1);
SearchHit hit = response.getHits().getAt(0);
assertThat(hit.getInnerHits().get("child_type").getAt(0).field("_parent").getValue(), equalTo("1"));
assertThat(hit.getInnerHits().get("child_type").getAt(0).getInnerHits().get("nested_type").getAt(0).field("_parent"), nullValue());
}
} }