Skip to content

Commit 0f10c4c

Browse files
committed
Make sure stored JSON fields are properly decoded. (#35279)
1 parent e792b78 commit 0f10c4c

File tree

3 files changed

+60
-0
lines changed

3 files changed

+60
-0
lines changed

server/src/main/java/org/elasticsearch/index/mapper/JsonFieldMapper.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,15 @@ public void setSplitQueriesOnWhitespace(boolean splitQueriesOnWhitespace) {
360360
this.splitQueriesOnWhitespace = splitQueriesOnWhitespace;
361361
}
362362

363+
@Override
364+
public Object valueForDisplay(Object value) {
365+
if (value == null) {
366+
return null;
367+
}
368+
BytesRef binaryValue = (BytesRef) value;
369+
return binaryValue.utf8ToString();
370+
}
371+
363372
@Override
364373
public Query existsQuery(QueryShardContext context) {
365374
return new TermQuery(new Term(FieldNamesFieldMapper.NAME, name()));

server/src/test/java/org/elasticsearch/index/mapper/RootJsonFieldTypeTests.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,14 @@ protected RootJsonFieldType createDefaultFieldType() {
4545
return new RootJsonFieldType();
4646
}
4747

48+
public void testValueForDisplay() {
49+
RootJsonFieldType ft = createDefaultFieldType();
50+
51+
String fieldValue = "{ \"key\": \"value\" }";
52+
BytesRef storedValue = new BytesRef(fieldValue);
53+
assertEquals(fieldValue, ft.valueForDisplay(storedValue));
54+
}
55+
4856
public void testTermQuery() {
4957
RootJsonFieldType ft = createDefaultFieldType();
5058
ft.setName("field");

server/src/test/java/org/elasticsearch/search/fields/SearchFieldsIT.java

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1180,4 +1180,47 @@ public void testLoadMetadata() throws Exception {
11801180
assertThat(fields.get("_routing").isMetadataField(), equalTo(true));
11811181
assertThat(fields.get("_routing").getValue().toString(), equalTo("1"));
11821182
}
1183+
1184+
public void testStoredJsonField() throws Exception {
1185+
XContentBuilder mapping = XContentFactory.jsonBuilder()
1186+
.startObject()
1187+
.startObject("_doc")
1188+
.startObject("properties")
1189+
.startObject("json_field")
1190+
.field("type", "json")
1191+
.field("store", true)
1192+
.endObject()
1193+
.endObject()
1194+
.endObject()
1195+
.endObject();
1196+
assertAcked(prepareCreate("test").addMapping("_doc", mapping));
1197+
ensureGreen("test");
1198+
1199+
XContentBuilder source = XContentFactory.jsonBuilder()
1200+
.startObject()
1201+
.startObject("json_field")
1202+
.field("key", "value")
1203+
.endObject()
1204+
.endObject();
1205+
index("test", "_doc", "1", source);
1206+
refresh("test");
1207+
1208+
SearchResponse response = client().prepareSearch("test")
1209+
.addStoredField("json_field")
1210+
.get();
1211+
assertSearchResponse(response);
1212+
assertHitCount(response, 1);
1213+
1214+
Map<String, DocumentField> fields = response.getHits().getAt(0).getFields();
1215+
DocumentField field = fields.get("json_field");
1216+
assertEquals("json_field", field.getName());
1217+
1218+
// We make sure to pretty-print here, since the field is always stored in pretty-printed format.
1219+
BytesReference storedValue = BytesReference.bytes(XContentFactory.jsonBuilder()
1220+
.prettyPrint()
1221+
.startObject()
1222+
.field("key", "value")
1223+
.endObject());
1224+
assertEquals(storedValue.utf8ToString(), field.getValue());
1225+
}
11831226
}

0 commit comments

Comments
 (0)