diff --git a/modules/percolator/src/main/java/org/elasticsearch/percolator/PercolatorMatchedSlotSubFetchPhase.java b/modules/percolator/src/main/java/org/elasticsearch/percolator/PercolatorMatchedSlotSubFetchPhase.java index fdcc9156b415e..0fecb95f520b1 100644 --- a/modules/percolator/src/main/java/org/elasticsearch/percolator/PercolatorMatchedSlotSubFetchPhase.java +++ b/modules/percolator/src/main/java/org/elasticsearch/percolator/PercolatorMatchedSlotSubFetchPhase.java @@ -33,6 +33,7 @@ import org.elasticsearch.Version; import org.elasticsearch.common.document.DocumentField; import org.elasticsearch.common.lucene.search.Queries; +import org.elasticsearch.index.mapper.MapperService; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.fetch.FetchSubPhase; import org.elasticsearch.search.internal.SearchContext; @@ -110,7 +111,8 @@ static void innerHitsExecute(Query mainQuery, IndexSearcher indexSearcher, Searc hit.fields(fields); } IntStream slots = convertTopDocsToSlots(topDocs, rootDocsBySlot); - fields.put(fieldName, new DocumentField(fieldName, slots.boxed().collect(Collectors.toList()))); + boolean isMetadataField = MapperService.isMetadataField(fieldName); + fields.put(fieldName, new DocumentField(fieldName, slots.boxed().collect(Collectors.toList()), isMetadataField)); } } } diff --git a/server/src/main/java/org/elasticsearch/common/document/DocumentField.java b/server/src/main/java/org/elasticsearch/common/document/DocumentField.java index 969c3347d67ae..bdff4c8c80d65 100644 --- a/server/src/main/java/org/elasticsearch/common/document/DocumentField.java +++ b/server/src/main/java/org/elasticsearch/common/document/DocumentField.java @@ -26,7 +26,6 @@ import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.index.get.GetResult; -import org.elasticsearch.index.mapper.MapperService; import org.elasticsearch.search.SearchHit; import java.io.IOException; @@ -47,14 +46,16 @@ public class DocumentField implements Streamable, ToXContentFragment, Iterable { private String name; + private Boolean isMetadataField; private List values; private DocumentField() { } - public DocumentField(String name, List values) { + public DocumentField(String name, List values, boolean isMetadataField) { this.name = Objects.requireNonNull(name, "name must not be null"); this.values = Objects.requireNonNull(values, "values must not be null"); + this.isMetadataField = isMetadataField; } /** @@ -85,7 +86,7 @@ public List getValues() { * @return The field is a metadata field */ public boolean isMetadataField() { - return MapperService.isMetadataField(name); + return this.isMetadataField; } @Override @@ -132,7 +133,7 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws return builder; } - public static DocumentField fromXContent(XContentParser parser) throws IOException { + public static DocumentField fromXContent(XContentParser parser, boolean inMetadataArea) throws IOException { ensureExpectedToken(XContentParser.Token.FIELD_NAME, parser.currentToken(), parser::getTokenLocation); String fieldName = parser.currentName(); XContentParser.Token token = parser.nextToken(); @@ -141,7 +142,7 @@ public static DocumentField fromXContent(XContentParser parser) throws IOExcepti while ((token = parser.nextToken()) != XContentParser.Token.END_ARRAY) { values.add(parseFieldsValue(parser)); } - return new DocumentField(fieldName, values); + return new DocumentField(fieldName, values, inMetadataArea); } @Override diff --git a/server/src/main/java/org/elasticsearch/index/get/GetResult.java b/server/src/main/java/org/elasticsearch/index/get/GetResult.java index 869bc548f899f..0f7b0b603677b 100644 --- a/server/src/main/java/org/elasticsearch/index/get/GetResult.java +++ b/server/src/main/java/org/elasticsearch/index/get/GetResult.java @@ -338,7 +338,9 @@ public static GetResult fromXContentEmbedded(XContentParser parser, String index } else if (FOUND.equals(currentFieldName)) { found = parser.booleanValue(); } else { - fields.put(currentFieldName, new DocumentField(currentFieldName, Collections.singletonList(parser.objectText()))); + // This fields is in metadata area of the xContent, thus should be treated as metadata + fields.put(currentFieldName, new DocumentField(currentFieldName, + Collections.singletonList(parser.objectText()), true)); } } else if (token == XContentParser.Token.START_OBJECT) { if (SourceFieldMapper.NAME.equals(currentFieldName)) { @@ -350,7 +352,7 @@ public static GetResult fromXContentEmbedded(XContentParser parser, String index } } else if (FIELDS.equals(currentFieldName)) { while(parser.nextToken() != XContentParser.Token.END_OBJECT) { - DocumentField getField = DocumentField.fromXContent(parser); + DocumentField getField = DocumentField.fromXContent(parser, false); fields.put(getField.getName(), getField); } } else { @@ -358,7 +360,7 @@ public static GetResult fromXContentEmbedded(XContentParser parser, String index } } else if (token == XContentParser.Token.START_ARRAY) { if (IgnoredFieldMapper.NAME.equals(currentFieldName)) { - fields.put(currentFieldName, new DocumentField(currentFieldName, parser.list())); + fields.put(currentFieldName, new DocumentField(currentFieldName, parser.list(), false)); } else { parser.skipChildren(); // skip potential inner arrays for forward compatibility } diff --git a/server/src/main/java/org/elasticsearch/index/get/ShardGetService.java b/server/src/main/java/org/elasticsearch/index/get/ShardGetService.java index 9fb1cb804946f..58351e75bdab8 100644 --- a/server/src/main/java/org/elasticsearch/index/get/ShardGetService.java +++ b/server/src/main/java/org/elasticsearch/index/get/ShardGetService.java @@ -202,7 +202,8 @@ private GetResult innerGetLoadFromStoredFields(String type, String id, String[] fieldVisitor.postProcess(mapperService); fields = new HashMap<>(fieldVisitor.fields().size()); for (Map.Entry> entry : fieldVisitor.fields().entrySet()) { - fields.put(entry.getKey(), new DocumentField(entry.getKey(), entry.getValue())); + boolean isMetadataField = MapperService.isMetadataField(entry.getKey()); + fields.put(entry.getKey(), new DocumentField(entry.getKey(), entry.getValue(), isMetadataField)); } } } diff --git a/server/src/main/java/org/elasticsearch/index/termvectors/TermVectorsService.java b/server/src/main/java/org/elasticsearch/index/termvectors/TermVectorsService.java index a05870b842f2d..3e9066b074e67 100644 --- a/server/src/main/java/org/elasticsearch/index/termvectors/TermVectorsService.java +++ b/server/src/main/java/org/elasticsearch/index/termvectors/TermVectorsService.java @@ -323,7 +323,8 @@ private static Fields generateTermVectorsFromDoc(IndexShard indexShard, TermVect seenFields.add(field.name()); } String[] values = doc.getValues(field.name()); - documentFields.add(new DocumentField(field.name(), Arrays.asList((Object[]) values))); + boolean isMetadataField = MapperService.isMetadataField(field.name()); + documentFields.add(new DocumentField(field.name(), Arrays.asList((Object[]) values), isMetadataField)); } return generateTermVectors(indexShard, XContentHelper.convertToMap(parsedDocument.source(), true, request.xContentType()).v2(), documentFields, diff --git a/server/src/main/java/org/elasticsearch/search/SearchHit.java b/server/src/main/java/org/elasticsearch/search/SearchHit.java index 4cf3bda83530b..7162d7b82b124 100644 --- a/server/src/main/java/org/elasticsearch/search/SearchHit.java +++ b/server/src/main/java/org/elasticsearch/search/SearchHit.java @@ -799,7 +799,7 @@ private static void declareMetaDataFields(ObjectParser, Void @SuppressWarnings("unchecked") Map fieldMap = (Map) map.computeIfAbsent(Fields.FIELDS, v -> new HashMap()); - DocumentField field = new DocumentField(metadatafield, list); + DocumentField field = new DocumentField(metadatafield, list, true); fieldMap.put(field.getName(), field); }, (p, c) -> parseFieldsValue(p), new ParseField(metadatafield)); @@ -809,7 +809,7 @@ private static void declareMetaDataFields(ObjectParser, Void Map fieldMap = (Map) map.computeIfAbsent(Fields.FIELDS, v -> new HashMap()); fieldMap.put(field.getName(), field); - }, (p, c) -> new DocumentField(metadatafield, Collections.singletonList(parseFieldsValue(p))), + }, (p, c) -> new DocumentField(metadatafield, Collections.singletonList(parseFieldsValue(p)), true), new ParseField(metadatafield), ValueType.VALUE); } } @@ -819,7 +819,7 @@ private static void declareMetaDataFields(ObjectParser, Void private static Map parseFields(XContentParser parser) throws IOException { Map fields = new HashMap<>(); while (parser.nextToken() != XContentParser.Token.END_OBJECT) { - DocumentField field = DocumentField.fromXContent(parser); + DocumentField field = DocumentField.fromXContent(parser, false); fields.put(field.getName(), field); } return fields; diff --git a/server/src/main/java/org/elasticsearch/search/fetch/FetchPhase.java b/server/src/main/java/org/elasticsearch/search/fetch/FetchPhase.java index ab2f864bfce35..fa4879d0908cb 100644 --- a/server/src/main/java/org/elasticsearch/search/fetch/FetchPhase.java +++ b/server/src/main/java/org/elasticsearch/search/fetch/FetchPhase.java @@ -243,10 +243,13 @@ private Map getSearchFields(SearchContext context, if (storedToRequestedFields.containsKey(storedField)) { for (String requestedField : storedToRequestedFields.get(storedField)) { - searchFields.put(requestedField, new DocumentField(requestedField, storedValues)); + boolean isMetadataField = MapperService.isMetadataField(requestedField); + + searchFields.put(requestedField, new DocumentField(requestedField, storedValues, isMetadataField)); } } else { - searchFields.put(storedField, new DocumentField(storedField, storedValues)); + boolean isMetadataField = MapperService.isMetadataField(storedField); + searchFields.put(storedField, new DocumentField(storedField, storedValues, isMetadataField)); } } return searchFields; diff --git a/server/src/main/java/org/elasticsearch/search/fetch/subphase/DocValueFieldsFetchSubPhase.java b/server/src/main/java/org/elasticsearch/search/fetch/subphase/DocValueFieldsFetchSubPhase.java index e94ac0fdf6c99..fd9e61a5ed4a2 100644 --- a/server/src/main/java/org/elasticsearch/search/fetch/subphase/DocValueFieldsFetchSubPhase.java +++ b/server/src/main/java/org/elasticsearch/search/fetch/subphase/DocValueFieldsFetchSubPhase.java @@ -31,6 +31,7 @@ import org.elasticsearch.index.fielddata.SortedBinaryDocValues; import org.elasticsearch.index.fielddata.SortedNumericDoubleValues; import org.elasticsearch.index.mapper.MappedFieldType; +import org.elasticsearch.index.mapper.MapperService; import org.elasticsearch.search.DocValueFormat; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.fetch.FetchSubPhase; @@ -124,7 +125,8 @@ public void hitsExecute(SearchContext context, SearchHit[] hits) throws IOExcept } DocumentField hitField = hit.getFields().get(field); if (hitField == null) { - hitField = new DocumentField(field, new ArrayList<>(2)); + boolean isMetadataField = MapperService.isMetadataField(field); + hitField = new DocumentField(field, new ArrayList<>(2), isMetadataField); hit.getFields().put(field, hitField); } final List values = hitField.getValues(); diff --git a/server/src/main/java/org/elasticsearch/search/fetch/subphase/ScriptFieldsFetchSubPhase.java b/server/src/main/java/org/elasticsearch/search/fetch/subphase/ScriptFieldsFetchSubPhase.java index 532441c0cf934..c180cfd4d9592 100644 --- a/server/src/main/java/org/elasticsearch/search/fetch/subphase/ScriptFieldsFetchSubPhase.java +++ b/server/src/main/java/org/elasticsearch/search/fetch/subphase/ScriptFieldsFetchSubPhase.java @@ -23,6 +23,7 @@ import org.apache.lucene.index.ReaderUtil; import org.elasticsearch.common.document.DocumentField; import org.elasticsearch.common.util.CollectionUtils; +import org.elasticsearch.index.mapper.MapperService; import org.elasticsearch.script.FieldScript; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.fetch.FetchSubPhase; @@ -84,7 +85,8 @@ public void hitsExecute(SearchContext context, SearchHit[] hits) throws IOExcept } else { values = Collections.singletonList(value); } - hitField = new DocumentField(scriptFieldName, values); + boolean isMetadataField = MapperService.isMetadataField(scriptFieldName); + hitField = new DocumentField(scriptFieldName, values, isMetadataField); hit.getFields().put(scriptFieldName, hitField); } } diff --git a/server/src/test/java/org/elasticsearch/action/explain/ExplainResponseTests.java b/server/src/test/java/org/elasticsearch/action/explain/ExplainResponseTests.java index 2a04a97667722..a8dd05f16a8ba 100644 --- a/server/src/test/java/org/elasticsearch/action/explain/ExplainResponseTests.java +++ b/server/src/test/java/org/elasticsearch/action/explain/ExplainResponseTests.java @@ -68,7 +68,7 @@ protected ExplainResponse createTestInstance() { 0, 1, randomNonNegativeLong(), true, RandomObjects.randomSource(random()), - singletonMap(fieldName, new DocumentField(fieldName, values))); + singletonMap(fieldName, new DocumentField(fieldName, values, false))); return new ExplainResponse(index, type, id, exist, explanation, getResult); } @@ -85,7 +85,7 @@ public void testToXContent() throws IOException { Explanation explanation = Explanation.match(1.0f, "description", Collections.emptySet()); GetResult getResult = new GetResult(null, null, null, 0, 1, -1, true, new BytesArray("{ \"field1\" : " + "\"value1\", \"field2\":\"value2\"}"), singletonMap("field1", new DocumentField("field1", - singletonList("value1")))); + singletonList("value1"), false))); ExplainResponse response = new ExplainResponse(index, type, id, exist, explanation, getResult); XContentBuilder builder = XContentFactory.contentBuilder(XContentType.JSON); diff --git a/server/src/test/java/org/elasticsearch/action/get/GetResponseTests.java b/server/src/test/java/org/elasticsearch/action/get/GetResponseTests.java index a215a47b89466..ba9d0e38bba55 100644 --- a/server/src/test/java/org/elasticsearch/action/get/GetResponseTests.java +++ b/server/src/test/java/org/elasticsearch/action/get/GetResponseTests.java @@ -94,7 +94,7 @@ public void testToXContent() { { GetResponse getResponse = new GetResponse(new GetResult("index", "type", "id", 0, 1, 1, true, new BytesArray("{ \"field1\" : " + "\"value1\", \"field2\":\"value2\"}"), Collections.singletonMap("field1", new DocumentField("field1", - Collections.singletonList("value1"))))); + Collections.singletonList("value1"), false)))); String output = Strings.toString(getResponse); assertEquals("{\"_index\":\"index\",\"_type\":\"type\",\"_id\":\"id\",\"_version\":1,\"_seq_no\":0,\"_primary_term\":1," + "\"found\":true,\"_source\":{ \"field1\" : \"value1\", \"field2\":\"value2\"},\"fields\":{\"field1\":[\"value1\"]}}", @@ -110,7 +110,7 @@ public void testToXContent() { public void testToString() { GetResponse getResponse = new GetResponse(new GetResult("index", "type", "id", 0, 1, 1, true, new BytesArray("{ \"field1\" : " + "\"value1\", \"field2\":\"value2\"}"), - Collections.singletonMap("field1", new DocumentField("field1", Collections.singletonList("value1"))))); + Collections.singletonMap("field1", new DocumentField("field1", Collections.singletonList("value1"), false)))); assertEquals("{\"_index\":\"index\",\"_type\":\"type\",\"_id\":\"id\",\"_version\":1,\"_seq_no\":0,\"_primary_term\":1," + "\"found\":true,\"_source\":{ \"field1\" : \"value1\", \"field2\":\"value2\"},\"fields\":{\"field1\":[\"value1\"]}}", getResponse.toString()); diff --git a/server/src/test/java/org/elasticsearch/action/search/ExpandSearchPhaseTests.java b/server/src/test/java/org/elasticsearch/action/search/ExpandSearchPhaseTests.java index d9de69a1c6c62..3b6f7cb33e310 100644 --- a/server/src/test/java/org/elasticsearch/action/search/ExpandSearchPhaseTests.java +++ b/server/src/test/java/org/elasticsearch/action/search/ExpandSearchPhaseTests.java @@ -104,7 +104,7 @@ void sendExecuteMultiSearch(MultiSearchRequest request, SearchTask task, ActionL }; SearchHits hits = new SearchHits(new SearchHit[]{new SearchHit(1, "ID", new Text("type"), - Collections.singletonMap("someField", new DocumentField("someField", Collections.singletonList(collapseValue))))}, + Collections.singletonMap("someField", new DocumentField("someField", Collections.singletonList(collapseValue), false)))}, new TotalHits(1, TotalHits.Relation.EQUAL_TO), 1.0F); InternalSearchResponse internalSearchResponse = new InternalSearchResponse(hits, null, null, null, false, null, 1); AtomicReference reference = new AtomicReference<>(); @@ -158,9 +158,9 @@ void sendExecuteMultiSearch(MultiSearchRequest request, SearchTask task, ActionL }; SearchHits hits = new SearchHits(new SearchHit[]{new SearchHit(1, "ID", new Text("type"), - Collections.singletonMap("someField", new DocumentField("someField", Collections.singletonList(collapseValue)))), + Collections.singletonMap("someField", new DocumentField("someField", Collections.singletonList(collapseValue), false))), new SearchHit(2, "ID2", new Text("type"), - Collections.singletonMap("someField", new DocumentField("someField", Collections.singletonList(collapseValue))))}, + Collections.singletonMap("someField", new DocumentField("someField", Collections.singletonList(collapseValue), false)))}, new TotalHits(1, TotalHits.Relation.EQUAL_TO), 1.0F); InternalSearchResponse internalSearchResponse = new InternalSearchResponse(hits, null, null, null, false, null, 1); AtomicReference reference = new AtomicReference<>(); @@ -190,9 +190,9 @@ void sendExecuteMultiSearch(MultiSearchRequest request, SearchTask task, ActionL }; SearchHits hits = new SearchHits(new SearchHit[]{new SearchHit(1, "ID", new Text("type"), - Collections.singletonMap("someField", new DocumentField("someField", Collections.singletonList(null)))), + Collections.singletonMap("someField", new DocumentField("someField", Collections.singletonList(null), false))), new SearchHit(2, "ID2", new Text("type"), - Collections.singletonMap("someField", new DocumentField("someField", Collections.singletonList(null))))}, + Collections.singletonMap("someField", new DocumentField("someField", Collections.singletonList(null), false)))}, new TotalHits(1, TotalHits.Relation.EQUAL_TO), 1.0F); InternalSearchResponse internalSearchResponse = new InternalSearchResponse(hits, null, null, null, false, null, 1); AtomicReference reference = new AtomicReference<>(); diff --git a/server/src/test/java/org/elasticsearch/action/update/UpdateRequestTests.java b/server/src/test/java/org/elasticsearch/action/update/UpdateRequestTests.java index 5a734352eafb2..66f7684d6dff1 100644 --- a/server/src/test/java/org/elasticsearch/action/update/UpdateRequestTests.java +++ b/server/src/test/java/org/elasticsearch/action/update/UpdateRequestTests.java @@ -560,7 +560,7 @@ public void testRoutingExtraction() throws Exception { assertNull(UpdateHelper.calculateRouting(getResult, indexRequest)); Map fields = new HashMap<>(); - fields.put("_routing", new DocumentField("_routing", Collections.singletonList("routing1"))); + fields.put("_routing", new DocumentField("_routing", Collections.singletonList("routing1"), false)); // Doc exists and has the parent and routing fields getResult = new GetResult("test", "type", "1", 0, 1, 0, true, null, fields); diff --git a/server/src/test/java/org/elasticsearch/action/update/UpdateResponseTests.java b/server/src/test/java/org/elasticsearch/action/update/UpdateResponseTests.java index 8ec0423b40699..7ca04cacbf9b7 100644 --- a/server/src/test/java/org/elasticsearch/action/update/UpdateResponseTests.java +++ b/server/src/test/java/org/elasticsearch/action/update/UpdateResponseTests.java @@ -69,8 +69,8 @@ public void testToXContent() throws IOException { { BytesReference source = new BytesArray("{\"title\":\"Book title\",\"isbn\":\"ABC-123\"}"); Map fields = new HashMap<>(); - fields.put("title", new DocumentField("title", Collections.singletonList("Book title"))); - fields.put("isbn", new DocumentField("isbn", Collections.singletonList("ABC-123"))); + fields.put("title", new DocumentField("title", Collections.singletonList("Book title"), false)); + fields.put("isbn", new DocumentField("isbn", Collections.singletonList("ABC-123"), false)); UpdateResponse updateResponse = new UpdateResponse(new ReplicationResponse.ShardInfo(3, 2), new ShardId("books", "books_uuid", 2), "book", "1", 7, 17, 2, UPDATED); diff --git a/server/src/test/java/org/elasticsearch/index/get/DocumentFieldTests.java b/server/src/test/java/org/elasticsearch/index/get/DocumentFieldTests.java index e2e3d4df67cf7..448771423f08c 100644 --- a/server/src/test/java/org/elasticsearch/index/get/DocumentFieldTests.java +++ b/server/src/test/java/org/elasticsearch/index/get/DocumentFieldTests.java @@ -47,9 +47,10 @@ public class DocumentFieldTests extends ESTestCase { public void testToXContent() { - DocumentField documentField = new DocumentField("field", Arrays.asList("value1", "value2")); + DocumentField documentField = new DocumentField("field", Arrays.asList("value1", "value2"), false); String output = Strings.toString(documentField); assertEquals("{\"field\":[\"value1\",\"value2\"]}", output); +// assertEquals("{\"field\":{\"value\":[\"value1\",\"value2\"],\"isMetadata\":true}}", output); } public void testEqualsAndHashcode() { @@ -70,7 +71,7 @@ public void testToAndFromXContent() throws Exception { //we need to move to the next token, the start object one that we manually added is not expected assertEquals(XContentParser.Token.START_OBJECT, parser.nextToken()); assertEquals(XContentParser.Token.FIELD_NAME, parser.nextToken()); - parsedDocumentField = DocumentField.fromXContent(parser); + parsedDocumentField = DocumentField.fromXContent(parser, false); assertEquals(XContentParser.Token.END_ARRAY, parser.currentToken()); assertEquals(XContentParser.Token.END_OBJECT, parser.nextToken()); assertNull(parser.nextToken()); @@ -81,13 +82,13 @@ public void testToAndFromXContent() throws Exception { } private static DocumentField copyDocumentField(DocumentField documentField) { - return new DocumentField(documentField.getName(), documentField.getValues()); + return new DocumentField(documentField.getName(), documentField.getValues(), false); } private static DocumentField mutateDocumentField(DocumentField documentField) { List> mutations = new ArrayList<>(); - mutations.add(() -> new DocumentField(randomUnicodeOfCodepointLength(15), documentField.getValues())); - mutations.add(() -> new DocumentField(documentField.getName(), randomDocumentField(XContentType.JSON).v1().getValues())); + mutations.add(() -> new DocumentField(randomUnicodeOfCodepointLength(15), documentField.getValues(), false)); + mutations.add(() -> new DocumentField(documentField.getName(), randomDocumentField(XContentType.JSON).v1().getValues(), false)); final int index = randomFrom(0, 1); final DocumentField randomCandidate = mutations.get(index).get(); if (!documentField.equals(randomCandidate)) { @@ -112,17 +113,17 @@ public static Tuple randomDocumentField(XContentTy for (int i = 0; i < numValues; i++) { ignoredFields.add(randomAlphaOfLengthBetween(3, 10)); } - documentField = new DocumentField(metaField, ignoredFields); + documentField = new DocumentField(metaField, ignoredFields, false); } else { //meta fields are single value only, besides _ignored - documentField = new DocumentField(metaField, Collections.singletonList(randomAlphaOfLengthBetween(3, 10))); + documentField = new DocumentField(metaField, Collections.singletonList(randomAlphaOfLengthBetween(3, 10)), false); } return Tuple.tuple(documentField, documentField); } else { String fieldName = randomAlphaOfLengthBetween(3, 10); Tuple, List> tuple = RandomObjects.randomStoredFieldValues(random(), xContentType); - DocumentField input = new DocumentField(fieldName, tuple.v1()); - DocumentField expected = new DocumentField(fieldName, tuple.v2()); + DocumentField input = new DocumentField(fieldName, tuple.v1(), false); + DocumentField expected = new DocumentField(fieldName, tuple.v2(), false); return Tuple.tuple(input, expected); } } diff --git a/server/src/test/java/org/elasticsearch/index/get/GetResultTests.java b/server/src/test/java/org/elasticsearch/index/get/GetResultTests.java index ad8673d13ea6b..6b0404a882204 100644 --- a/server/src/test/java/org/elasticsearch/index/get/GetResultTests.java +++ b/server/src/test/java/org/elasticsearch/index/get/GetResultTests.java @@ -76,7 +76,7 @@ public void testToXContent() throws IOException { { GetResult getResult = new GetResult("index", "type", "id", 0, 1, 1, true, new BytesArray("{ \"field1\" : " + "\"value1\", \"field2\":\"value2\"}"), singletonMap("field1", new DocumentField("field1", - singletonList("value1")))); + singletonList("value1"), false))); String output = Strings.toString(getResult); assertEquals("{\"_index\":\"index\",\"_type\":\"type\",\"_id\":\"id\",\"_version\":1,\"_seq_no\":0,\"_primary_term\":1," + "\"found\":true,\"_source\":{ \"field1\" : \"value1\", \"field2\":\"value2\"},\"fields\":{\"field1\":[\"value1\"]}}", @@ -118,8 +118,8 @@ public void testToAndFromXContentEmbedded() throws Exception { public void testToXContentEmbedded() throws IOException { Map fields = new HashMap<>(); - fields.put("foo", new DocumentField("foo", singletonList("bar"))); - fields.put("baz", new DocumentField("baz", Arrays.asList("baz_0", "baz_1"))); + fields.put("foo", new DocumentField("foo", singletonList("bar"), false)); + fields.put("baz", new DocumentField("baz", Arrays.asList("baz_0", "baz_1"), false)); GetResult getResult = new GetResult("index", "type", "id", 0, 1, 2, true, new BytesArray("{\"foo\":\"bar\",\"baz\":[\"baz_0\",\"baz_1\"]}"), fields); diff --git a/server/src/test/java/org/elasticsearch/search/fetch/FetchSubPhasePluginIT.java b/server/src/test/java/org/elasticsearch/search/fetch/FetchSubPhasePluginIT.java index e6f7ecf6b37e7..0807140cc519f 100644 --- a/server/src/test/java/org/elasticsearch/search/fetch/FetchSubPhasePluginIT.java +++ b/server/src/test/java/org/elasticsearch/search/fetch/FetchSubPhasePluginIT.java @@ -32,6 +32,7 @@ import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentParser; +import org.elasticsearch.index.mapper.MapperService; import org.elasticsearch.index.termvectors.TermVectorsService; import org.elasticsearch.plugins.Plugin; import org.elasticsearch.plugins.SearchPlugin; @@ -130,7 +131,8 @@ public void hitExecute(SearchContext context, HitContext hitContext) { } DocumentField hitField = hitContext.hit().getFields().get(NAME); if (hitField == null) { - hitField = new DocumentField(NAME, new ArrayList<>(1)); + boolean isMetadataField = MapperService.isMetadataField(NAME); + hitField = new DocumentField(NAME, new ArrayList<>(1), isMetadataField); hitContext.hit().getFields().put(NAME, hitField); } TermVectorsRequest termVectorsRequest = new TermVectorsRequest(context.indexShard().shardId().getIndex().getName(), diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/datafeed/extractor/scroll/ScrollDataExtractorTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/datafeed/extractor/scroll/ScrollDataExtractorTests.java index 170c95d1cab6b..6e52b7b4c5144 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/datafeed/extractor/scroll/ScrollDataExtractorTests.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/datafeed/extractor/scroll/ScrollDataExtractorTests.java @@ -481,9 +481,9 @@ private SearchResponse createSearchResponse(List timestamps, List for (int i = 0; i < timestamps.size(); i++) { SearchHit hit = new SearchHit(randomInt()); Map fields = new HashMap<>(); - fields.put(extractedFields.timeField(), new DocumentField("time", Collections.singletonList(timestamps.get(i)))); - fields.put("field_1", new DocumentField("field_1", Collections.singletonList(field1Values.get(i)))); - fields.put("field_2", new DocumentField("field_2", Collections.singletonList(field2Values.get(i)))); + fields.put(extractedFields.timeField(), new DocumentField("time", Collections.singletonList(timestamps.get(i)), false)); + fields.put("field_1", new DocumentField("field_1", Collections.singletonList(field1Values.get(i)), false)); + fields.put("field_2", new DocumentField("field_2", Collections.singletonList(field2Values.get(i)), false)); hit.fields(fields); hits.add(hit); } diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/job/persistence/JobResultsProviderTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/job/persistence/JobResultsProviderTests.java index 8532cfc4feac4..3adb872454ced 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/job/persistence/JobResultsProviderTests.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/job/persistence/JobResultsProviderTests.java @@ -841,8 +841,8 @@ private static SearchResponse createSearchResponse(List> sou Map _source = new HashMap<>(map); Map fields = new HashMap<>(); - fields.put("field_1", new DocumentField("field_1", Collections.singletonList("foo"))); - fields.put("field_2", new DocumentField("field_2", Collections.singletonList("foo"))); + fields.put("field_1", new DocumentField("field_1", Collections.singletonList("foo"), false)); + fields.put("field_2", new DocumentField("field_2", Collections.singletonList("foo"), false)); SearchHit hit = new SearchHit(123, String.valueOf(map.hashCode()), new Text("foo"), fields) .sourceRef(BytesReference.bytes(XContentFactory.jsonBuilder().map(_source))); diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/test/SearchHitBuilder.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/test/SearchHitBuilder.java index af4be50a13453..2afa3bace80b7 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/test/SearchHitBuilder.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/test/SearchHitBuilder.java @@ -7,6 +7,7 @@ import org.elasticsearch.common.bytes.BytesArray; import org.elasticsearch.common.document.DocumentField; +import org.elasticsearch.index.mapper.MapperService; import org.elasticsearch.search.SearchHit; import java.util.Arrays; @@ -32,7 +33,8 @@ public SearchHitBuilder addField(String name, Object value) { } public SearchHitBuilder addField(String name, List values) { - fields.put(name, new DocumentField(name, values)); + boolean isMetadataField = MapperService.isMetadataField(name); + fields.put(name, new DocumentField(name, values, isMetadataField)); return this; } diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/execution/search/extractor/ComputingExtractorTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/execution/search/extractor/ComputingExtractorTests.java index c628b090df2a6..a12a38e432dd2 100644 --- a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/execution/search/extractor/ComputingExtractorTests.java +++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/execution/search/extractor/ComputingExtractorTests.java @@ -78,7 +78,7 @@ public void testGet() { double value = randomDouble(); double expected = Math.log(value); SearchHit hit = new SearchHit(1); - DocumentField field = new DocumentField(fieldName, singletonList(value)); + DocumentField field = new DocumentField(fieldName, singletonList(value), false); hit.fields(singletonMap(fieldName, field)); assertEquals(expected, extractor.process(hit)); } diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/execution/search/extractor/FieldHitExtractorTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/execution/search/extractor/FieldHitExtractorTests.java index 2e66192fbcbfc..e35b49dfb4d76 100644 --- a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/execution/search/extractor/FieldHitExtractorTests.java +++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/execution/search/extractor/FieldHitExtractorTests.java @@ -70,7 +70,7 @@ public void testGetDottedValueWithDocValues() { } SearchHit hit = new SearchHit(1); - DocumentField field = new DocumentField(fieldName, documentFieldValues); + DocumentField field = new DocumentField(fieldName, documentFieldValues, false); hit.fields(singletonMap(fieldName, field)); Object result = documentFieldValues.isEmpty() ? null : documentFieldValues.get(0); assertEquals(result, extractor.extract(hit)); @@ -131,7 +131,7 @@ public void testGetDocValue() { documentFieldValues.add(randomValue()); } SearchHit hit = new SearchHit(1); - DocumentField field = new DocumentField(fieldName, documentFieldValues); + DocumentField field = new DocumentField(fieldName, documentFieldValues, false); hit.fields(singletonMap(fieldName, field)); Object result = documentFieldValues.isEmpty() ? null : documentFieldValues.get(0); assertEquals(result, extractor.extract(hit)); @@ -142,7 +142,7 @@ public void testGetDate() { long millis = 1526467911780L; List documentFieldValues = Collections.singletonList(Long.toString(millis)); SearchHit hit = new SearchHit(1); - DocumentField field = new DocumentField("my_date_field", documentFieldValues); + DocumentField field = new DocumentField("my_date_field", documentFieldValues, false); hit.fields(singletonMap("my_date_field", field)); FieldHitExtractor extractor = new FieldHitExtractor("my_date_field", DataType.DATETIME, true); assertEquals(DateUtils.asDateTime(millis), extractor.extract(hit)); @@ -180,7 +180,7 @@ public void testMultiValuedDocValue() { String fieldName = randomAlphaOfLength(5); FieldHitExtractor fe = new FieldHitExtractor(fieldName, null, true); SearchHit hit = new SearchHit(1); - DocumentField field = new DocumentField(fieldName, asList("a", "b")); + DocumentField field = new DocumentField(fieldName, asList("a", "b"), false); hit.fields(singletonMap(fieldName, field)); SqlException ex = expectThrows(SqlException.class, () -> fe.extract(hit)); assertThat(ex.getMessage(), is("Arrays (returned by [" + fieldName + "]) are not supported"));