Skip to content

Commit fa6ba7d

Browse files
committed
Make sure stored JSON fields are properly decoded. (#35279)
1 parent 10afff2 commit fa6ba7d

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
@@ -1226,4 +1226,47 @@ public void testLoadMetadata() throws Exception {
12261226
assertThat(fields.get("_routing").isMetadataField(), equalTo(true));
12271227
assertThat(fields.get("_routing").getValue().toString(), equalTo("1"));
12281228
}
1229+
1230+
public void testStoredJsonField() throws Exception {
1231+
XContentBuilder mapping = XContentFactory.jsonBuilder()
1232+
.startObject()
1233+
.startObject("_doc")
1234+
.startObject("properties")
1235+
.startObject("json_field")
1236+
.field("type", "json")
1237+
.field("store", true)
1238+
.endObject()
1239+
.endObject()
1240+
.endObject()
1241+
.endObject();
1242+
assertAcked(prepareCreate("test").addMapping("_doc", mapping));
1243+
ensureGreen("test");
1244+
1245+
XContentBuilder source = XContentFactory.jsonBuilder()
1246+
.startObject()
1247+
.startObject("json_field")
1248+
.field("key", "value")
1249+
.endObject()
1250+
.endObject();
1251+
index("test", "_doc", "1", source);
1252+
refresh("test");
1253+
1254+
SearchResponse response = client().prepareSearch("test")
1255+
.addStoredField("json_field")
1256+
.get();
1257+
assertSearchResponse(response);
1258+
assertHitCount(response, 1);
1259+
1260+
Map<String, DocumentField> fields = response.getHits().getAt(0).getFields();
1261+
DocumentField field = fields.get("json_field");
1262+
assertEquals("json_field", field.getName());
1263+
1264+
// We make sure to pretty-print here, since the field is always stored in pretty-printed format.
1265+
BytesReference storedValue = BytesReference.bytes(XContentFactory.jsonBuilder()
1266+
.prettyPrint()
1267+
.startObject()
1268+
.field("key", "value")
1269+
.endObject());
1270+
assertEquals(storedValue.utf8ToString(), field.getValue());
1271+
}
12291272
}

0 commit comments

Comments
 (0)