From c6968883a70ce33a11fc3da67190cd181acc08a7 Mon Sep 17 00:00:00 2001 From: Ryan Ernst Date: Wed, 4 Feb 2015 13:17:38 -0800 Subject: [PATCH] Mappings: Remove support for new indexes using path setting in object/nested fields or index_name in any field Backcompat is still here for indexes created before 2.0. closes #6677 --- dev-tools/create-bwc-index.py | 17 ++++- .../indices/get-field-mapping.asciidoc | 21 +++--- .../mapping/fields/all-field.asciidoc | 2 +- .../mapping/types/array-type.asciidoc | 2 +- .../50_field_wildcards.yaml | 11 +-- .../mapper/core/AbstractFieldMapper.java | 25 +++++-- .../mapper/core/CompletionFieldMapper.java | 6 +- .../index/mapper/core/TypeParsers.java | 6 +- .../index/mapper/geo/GeoPointFieldMapper.java | 3 +- .../index/mapper/object/ObjectMapper.java | 7 +- .../index/query/QueryParseContext.java | 6 +- .../index/mapper/all/mapping.json | 3 +- .../mapping_boost_omit_positions_on_all.json | 3 +- .../mapper/all/mapping_offsets_on_all.json | 3 +- .../all/mapping_omit_positions_on_all.json | 3 +- .../index/mapper/all/noboost-mapping.json | 3 +- .../index/mapper/all/store-mapping.json | 3 +- .../index/mapper/path/PathMapperTests.java | 14 ---- .../index/mapper/path/test-mapping.json | 8 +- .../index/mapper/simple/test-mapping.json | 7 +- .../highlight/HighlighterSearchTests.java | 69 ------------------ .../suggest/CompletionSuggestSearchTests.java | 8 +- .../search/suggest/SuggestSearchTests.java | 12 +-- .../elasticsearch/bwcompat/index-1.4.2.zip | Bin 23872 -> 26377 bytes .../org/elasticsearch/bwcompat/repo-1.4.2.zip | Bin 20651 -> 22975 bytes 25 files changed, 80 insertions(+), 162 deletions(-) diff --git a/dev-tools/create-bwc-index.py b/dev-tools/create-bwc-index.py index c0a51239b28c0..6e15c16bcd35a 100644 --- a/dev-tools/create-bwc-index.py +++ b/dev-tools/create-bwc-index.py @@ -159,7 +159,22 @@ def generate_index(client, version): 'index_analyzer': 'standard', 'search_analyzer': 'keyword', 'search_quote_analyzer': 'english', - } + } + mappings['index_name_and_path'] = { + 'properties': { + 'parent_multi_field': { + 'type': 'string', + 'path': 'just_name', + 'fields': { + 'raw': {'type': 'string', 'index': 'not_analyzed', 'index_name': 'raw_multi_field'} + } + }, + 'field_with_index_name': { + 'type': 'string', + 'index_name': 'custom_index_name_for_field' + } + } + } client.indices.create(index='test', body={ 'settings': { diff --git a/docs/reference/indices/get-field-mapping.asciidoc b/docs/reference/indices/get-field-mapping.asciidoc index 695a0f48c24f8..2aeb853e9f44d 100644 --- a/docs/reference/indices/get-field-mapping.asciidoc +++ b/docs/reference/indices/get-field-mapping.asciidoc @@ -60,8 +60,6 @@ You can also use wildcards. The field names can be any of the following: [horizontal] Full names:: the full path, including any parent object name the field is part of (ex. `user.id`). -Index names:: the name of the lucene field (can be different than the - field name if the `index_name` option of the mapping is used). Field names:: the name of the field without the path to it (ex. `id` for `{ "user" : { "id" : 1 } }`). The above options are specified in the order the `field` parameter is resolved. @@ -76,12 +74,12 @@ For example, consider the following mapping: "article": { "properties": { "id": { "type": "string" }, - "title": { "type": "string", "index_name": "text" }, - "abstract": { "type": "string", "index_name": "text" }, + "title": { "type": "string"}, + "abstract": { "type": "string"}, "author": { "properties": { "id": { "type": "string" }, - "name": { "type": "string", "index_name": "author" } + "name": { "type": "string" } } } } @@ -89,13 +87,12 @@ For example, consider the following mapping: } -------------------------------------------------- -To select the `id` of the `author` field, you can use its full name `author.id`. Using `text` will return -the mapping of `abstract` as it is one of the fields which map to the Lucene field `text`. `name` will return +To select the `id` of the `author` field, you can use its full name `author.id`. `name` will return the field `author.name`: [source,js] -------------------------------------------------- -curl -XGET "http://localhost:9200/publications/_mapping/article/field/author.id,text,name" +curl -XGET "http://localhost:9200/publications/_mapping/article/field/author.id,abstract,name" -------------------------------------------------- returns: @@ -105,10 +102,10 @@ returns: { "publications": { "article": { - "text": { + "abstract": { "full_name": "abstract", "mapping": { - "abstract": { "type": "string", "index_name": "text" } + "abstract": { "type": "string" } } }, "author.id": { @@ -120,7 +117,7 @@ returns: "name": { "full_name": "author.name", "mapping": { - "name": { "type": "string", "index_name": "author" } + "name": { "type": "string" } } } } @@ -130,7 +127,7 @@ returns: Note how the response always use the same fields specified in the request as keys. The `full_name` in every entry contains the full name of the field whose mapping were returned. -This is useful when the request can refer to to multiple fields (like `text` above). +This is useful when the request can refer to to multiple fields. [float] === Other options diff --git a/docs/reference/mapping/fields/all-field.asciidoc b/docs/reference/mapping/fields/all-field.asciidoc index d66dbdb536260..519d3809923c2 100644 --- a/docs/reference/mapping/fields/all-field.asciidoc +++ b/docs/reference/mapping/fields/all-field.asciidoc @@ -43,7 +43,7 @@ Here is a sample mapping: "properties" : { "first" : { "properties" : { - "location" : {"type" : "string", "store" : true, "index_name" : "firstLocation"} + "location" : {"type" : "string", "store" : true} } }, "last" : { diff --git a/docs/reference/mapping/types/array-type.asciidoc b/docs/reference/mapping/types/array-type.asciidoc index 3f887b1c6f73e..3f3d832d66fc8 100644 --- a/docs/reference/mapping/types/array-type.asciidoc +++ b/docs/reference/mapping/types/array-type.asciidoc @@ -38,7 +38,7 @@ is a sample explicit mapping: "tweet" : { "properties" : { "message" : {"type" : "string"}, - "tags" : {"type" : "string", "index_name" : "tag"}, + "tags" : {"type" : "string"}, "lists" : { "properties" : { "name" : {"type" : "string"}, diff --git a/rest-api-spec/test/indices.get_field_mapping/50_field_wildcards.yaml b/rest-api-spec/test/indices.get_field_mapping/50_field_wildcards.yaml index 766be059d7831..0a820cbefaeb2 100644 --- a/rest-api-spec/test/indices.get_field_mapping/50_field_wildcards.yaml +++ b/rest-api-spec/test/indices.get_field_mapping/50_field_wildcards.yaml @@ -12,16 +12,13 @@ setup: t2: type: string obj: - path: just_name properties: t1: type: string i_t1: type: string - index_name: t1 i_t3: type: string - index_name: t3 - do: indices.create: @@ -35,16 +32,13 @@ setup: t2: type: string obj: - path: just_name properties: t1: type: string i_t1: type: string - index_name: t1 i_t3: type: string - index_name: t3 - do: cluster.health: @@ -71,12 +65,9 @@ setup: index: test_index field: "t*" -# i_t1 matches the pattern using it's index name, but t1 already means a full name -# of a field and thus takes precedence. - match: {test_index.mappings.test_type.t1.full_name: t1 } - match: {test_index.mappings.test_type.t2.full_name: t2 } - - match: {test_index.mappings.test_type.t3.full_name: obj.i_t3 } - - length: {test_index.mappings.test_type: 3} + - length: {test_index.mappings.test_type: 2} --- "Get field mapping with *t1 for fields": diff --git a/src/main/java/org/elasticsearch/index/mapper/core/AbstractFieldMapper.java b/src/main/java/org/elasticsearch/index/mapper/core/AbstractFieldMapper.java index dffb8f30fb1f3..6ae49ce16dc08 100644 --- a/src/main/java/org/elasticsearch/index/mapper/core/AbstractFieldMapper.java +++ b/src/main/java/org/elasticsearch/index/mapper/core/AbstractFieldMapper.java @@ -35,6 +35,7 @@ import org.apache.lucene.search.*; import org.apache.lucene.util.BytesRef; import org.elasticsearch.ElasticsearchIllegalArgumentException; +import org.elasticsearch.Version; import org.elasticsearch.common.Nullable; import org.elasticsearch.common.collect.ImmutableOpenMap; import org.elasticsearch.common.lucene.BytesRefs; @@ -259,16 +260,26 @@ public T copyTo(CopyTo copyTo) { return builder; } - public Names buildNames(BuilderContext context) { - return new Names(name, buildIndexName(context), indexName == null ? name : indexName, buildFullName(context), context.path().sourcePath()); + protected Names buildNames(BuilderContext context) { + return new Names(name, buildIndexName(context), buildIndexNameClean(context), buildFullName(context), context.path().sourcePath()); } - public String buildIndexName(BuilderContext context) { + protected String buildIndexName(BuilderContext context) { + if (context.indexCreatedVersion().onOrAfter(Version.V_2_0_0)) { + return buildFullName(context); + } String actualIndexName = indexName == null ? name : indexName; return context.path().pathAsText(actualIndexName); } + + protected String buildIndexNameClean(BuilderContext context) { + if (context.indexCreatedVersion().onOrAfter(Version.V_2_0_0)) { + return buildFullName(context); + } + return indexName == null ? name : indexName; + } - public String buildFullName(BuilderContext context) { + protected String buildFullName(BuilderContext context) { return context.path().fullPathAsText(name); } } @@ -287,6 +298,7 @@ public String buildFullName(BuilderContext context) { protected FieldDataType fieldDataType; protected final MultiFields multiFields; protected CopyTo copyTo; + protected final boolean writePre20Metadata; protected AbstractFieldMapper(Names names, float boost, FieldType fieldType, Boolean docValues, NamedAnalyzer indexAnalyzer, NamedAnalyzer searchAnalyzer, PostingsFormatProvider postingsFormat, @@ -340,6 +352,9 @@ protected AbstractFieldMapper(Names names, float boost, FieldType fieldType, Boo } this.multiFields = multiFields; this.copyTo = copyTo; + // the short circuit check to EMPTY here is necessary because some built in fields pass EMPTY for simplified ctors + this.writePre20Metadata = indexSettings != null && indexSettings.equals(ImmutableSettings.EMPTY) == false && + Version.indexCreated(indexSettings).before(Version.V_2_0_0); } @Nullable @@ -690,7 +705,7 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws protected void doXContentBody(XContentBuilder builder, boolean includeDefaults, Params params) throws IOException { builder.field("type", contentType()); - if (includeDefaults || !names.name().equals(names.indexNameClean())) { + if (writePre20Metadata && (includeDefaults || !names.name().equals(names.indexNameClean()))) { builder.field("index_name", names.indexNameClean()); } diff --git a/src/main/java/org/elasticsearch/index/mapper/core/CompletionFieldMapper.java b/src/main/java/org/elasticsearch/index/mapper/core/CompletionFieldMapper.java index 05ed88426a01c..905d50ccec585 100644 --- a/src/main/java/org/elasticsearch/index/mapper/core/CompletionFieldMapper.java +++ b/src/main/java/org/elasticsearch/index/mapper/core/CompletionFieldMapper.java @@ -188,10 +188,8 @@ public static class TypeParser implements Mapper.TypeParser { } else if (Fields.MAX_INPUT_LENGTH.match(fieldName)) { builder.maxInputLength(Integer.parseInt(fieldNode.toString())); iterator.remove(); - } else if ("fields".equals(fieldName) || "path".equals(fieldName)) { - if (parseMultiField(builder, name, parserContext, fieldName, fieldNode)) { - iterator.remove(); - } + } else if (parseMultiField(builder, name, parserContext, fieldName, fieldNode)) { + iterator.remove(); } else if (fieldName.equals(Fields.CONTEXT)) { builder.contextMapping(ContextBuilder.loadMappings(fieldNode, parserContext.indexVersionCreated())); iterator.remove(); diff --git a/src/main/java/org/elasticsearch/index/mapper/core/TypeParsers.java b/src/main/java/org/elasticsearch/index/mapper/core/TypeParsers.java index da8db331a8081..7eaf6a9b07c93 100644 --- a/src/main/java/org/elasticsearch/index/mapper/core/TypeParsers.java +++ b/src/main/java/org/elasticsearch/index/mapper/core/TypeParsers.java @@ -69,7 +69,7 @@ public class TypeParsers { Map.Entry entry = iterator.next(); String fieldName = Strings.toUnderscoreCase(entry.getKey()); Object fieldNode = entry.getValue(); - if (fieldName.equals("path")) { + if (fieldName.equals("path") && parserContext.indexVersionCreated().before(Version.V_2_0_0)) { pathType = parsePathType(name, fieldNode.toString()); iterator.remove(); } else if (fieldName.equals("fields")) { @@ -188,7 +188,7 @@ public static void parseField(AbstractFieldMapper.Builder builder, String name, Map.Entry entry = iterator.next(); final String propName = Strings.toUnderscoreCase(entry.getKey()); final Object propNode = entry.getValue(); - if (propName.equals("index_name")) { + if (propName.equals("index_name") && parserContext.indexVersionCreated().before(Version.V_2_0_0)) { builder.indexName(propNode.toString()); iterator.remove(); } else if (propName.equals("store")) { @@ -303,7 +303,7 @@ public static void parseField(AbstractFieldMapper.Builder builder, String name, } public static boolean parseMultiField(AbstractFieldMapper.Builder builder, String name, Mapper.TypeParser.ParserContext parserContext, String propName, Object propNode) { - if (propName.equals("path")) { + if (propName.equals("path") && parserContext.indexVersionCreated().before(Version.V_2_0_0)) { builder.multiFieldPathType(parsePathType(name, propNode.toString())); return true; } else if (propName.equals("fields")) { diff --git a/src/main/java/org/elasticsearch/index/mapper/geo/GeoPointFieldMapper.java b/src/main/java/org/elasticsearch/index/mapper/geo/GeoPointFieldMapper.java index cf5eae24ed88e..4998dc7b0aa84 100644 --- a/src/main/java/org/elasticsearch/index/mapper/geo/GeoPointFieldMapper.java +++ b/src/main/java/org/elasticsearch/index/mapper/geo/GeoPointFieldMapper.java @@ -29,6 +29,7 @@ import org.apache.lucene.util.BytesRef; import org.elasticsearch.ElasticsearchIllegalArgumentException; import org.elasticsearch.ElasticsearchIllegalStateException; +import org.elasticsearch.Version; import org.elasticsearch.common.Nullable; import org.elasticsearch.common.Strings; import org.elasticsearch.common.geo.GeoDistance; @@ -211,7 +212,7 @@ public static class TypeParser implements Mapper.TypeParser { Map.Entry entry = iterator.next(); String fieldName = Strings.toUnderscoreCase(entry.getKey()); Object fieldNode = entry.getValue(); - if (fieldName.equals("path")) { + if (fieldName.equals("path") && parserContext.indexVersionCreated().before(Version.V_2_0_0)) { builder.multiFieldPathType(parsePathType(name, fieldNode.toString())); iterator.remove(); } else if (fieldName.equals("lat_lon")) { diff --git a/src/main/java/org/elasticsearch/index/mapper/object/ObjectMapper.java b/src/main/java/org/elasticsearch/index/mapper/object/ObjectMapper.java index 5f5f299fa14ec..5a1a6ecede9d2 100644 --- a/src/main/java/org/elasticsearch/index/mapper/object/ObjectMapper.java +++ b/src/main/java/org/elasticsearch/index/mapper/object/ObjectMapper.java @@ -28,6 +28,7 @@ import org.apache.lucene.util.BytesRef; import org.elasticsearch.ElasticsearchIllegalStateException; import org.elasticsearch.ElasticsearchParseException; +import org.elasticsearch.Version; import org.elasticsearch.common.Nullable; import org.elasticsearch.common.Strings; import org.elasticsearch.common.collect.CopyOnWriteHashMap; @@ -217,7 +218,7 @@ public Mapper.Builder parse(String name, Map node, ParserContext Map.Entry entry = iterator.next(); String fieldName = Strings.toUnderscoreCase(entry.getKey()); Object fieldNode = entry.getValue(); - if (parseObjectOrDocumentTypeProperties(fieldName, fieldNode, parserContext, builder) || parseObjectProperties(name, fieldName, fieldNode, builder)) { + if (parseObjectOrDocumentTypeProperties(fieldName, fieldNode, parserContext, builder) || parseObjectProperties(name, fieldName, fieldNode, parserContext, builder)) { iterator.remove(); } } @@ -252,8 +253,8 @@ protected static boolean parseObjectOrDocumentTypeProperties(String fieldName, O return false; } - protected static boolean parseObjectProperties(String name, String fieldName, Object fieldNode, ObjectMapper.Builder builder) { - if (fieldName.equals("path")) { + protected static boolean parseObjectProperties(String name, String fieldName, Object fieldNode, ParserContext parserContext, ObjectMapper.Builder builder) { + if (fieldName.equals("path") && parserContext.indexVersionCreated().before(Version.V_2_0_0)) { builder.pathType(parsePathType(name, fieldNode.toString())); return true; } diff --git a/src/main/java/org/elasticsearch/index/query/QueryParseContext.java b/src/main/java/org/elasticsearch/index/query/QueryParseContext.java index dbcb6baf44eb1..93acca5423736 100644 --- a/src/main/java/org/elasticsearch/index/query/QueryParseContext.java +++ b/src/main/java/org/elasticsearch/index/query/QueryParseContext.java @@ -32,6 +32,7 @@ import org.apache.lucene.search.similarities.Similarity; import org.apache.lucene.util.Bits; import org.elasticsearch.Version; +import org.elasticsearch.cluster.metadata.IndexMetaData; import org.elasticsearch.common.Nullable; import org.elasticsearch.common.ParseField; import org.elasticsearch.common.lucene.HashedBytesRef; @@ -40,6 +41,7 @@ import org.elasticsearch.common.lucene.search.Queries; import org.elasticsearch.common.lucene.search.ResolvableFilter; import org.elasticsearch.common.settings.ImmutableSettings; +import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.index.Index; import org.elasticsearch.index.analysis.AnalysisService; @@ -413,7 +415,9 @@ private MapperService.SmartNameFieldMappers failIfFieldMappingNotFound(String na return fieldMapping; } else if (mapUnmappedFieldAsString){ StringFieldMapper.Builder builder = MapperBuilders.stringField(name); - StringFieldMapper stringFieldMapper = builder.build(new Mapper.BuilderContext(ImmutableSettings.EMPTY, new ContentPath(1))); + // it would be better to pass the real index settings, but they are not easily accessible from here... + Settings settings = ImmutableSettings.builder().put(IndexMetaData.SETTING_VERSION_CREATED, indexQueryParser.getIndexCreatedVersion()).build(); + StringFieldMapper stringFieldMapper = builder.build(new Mapper.BuilderContext(settings, new ContentPath(1))); return new MapperService.SmartNameFieldMappers(mapperService(), new FieldMappers(stringFieldMapper), null, false); } else { Version indexCreatedVersion = indexQueryParser.getIndexCreatedVersion(); diff --git a/src/test/java/org/elasticsearch/index/mapper/all/mapping.json b/src/test/java/org/elasticsearch/index/mapper/all/mapping.json index 6c2120ff25201..f956b84f957ed 100644 --- a/src/test/java/org/elasticsearch/index/mapper/all/mapping.json +++ b/src/test/java/org/elasticsearch/index/mapper/all/mapping.json @@ -29,8 +29,7 @@ "properties":{ "location":{ "type":"string", - "store":"yes", - "index_name":"firstLocation" + "store":"yes" } } }, diff --git a/src/test/java/org/elasticsearch/index/mapper/all/mapping_boost_omit_positions_on_all.json b/src/test/java/org/elasticsearch/index/mapper/all/mapping_boost_omit_positions_on_all.json index f9be13cd1e454..452ef9f083ba8 100644 --- a/src/test/java/org/elasticsearch/index/mapper/all/mapping_boost_omit_positions_on_all.json +++ b/src/test/java/org/elasticsearch/index/mapper/all/mapping_boost_omit_positions_on_all.json @@ -29,8 +29,7 @@ "properties":{ "location":{ "type":"string", - "store":"yes", - "index_name":"firstLocation" + "store":"yes" } } }, diff --git a/src/test/java/org/elasticsearch/index/mapper/all/mapping_offsets_on_all.json b/src/test/java/org/elasticsearch/index/mapper/all/mapping_offsets_on_all.json index 43aa682685fa6..f6b0699beeeda 100644 --- a/src/test/java/org/elasticsearch/index/mapper/all/mapping_offsets_on_all.json +++ b/src/test/java/org/elasticsearch/index/mapper/all/mapping_offsets_on_all.json @@ -29,8 +29,7 @@ "properties":{ "location":{ "type":"string", - "store":"yes", - "index_name":"firstLocation" + "store":"yes" } } }, diff --git a/src/test/java/org/elasticsearch/index/mapper/all/mapping_omit_positions_on_all.json b/src/test/java/org/elasticsearch/index/mapper/all/mapping_omit_positions_on_all.json index e232192d905aa..f8e418ce8eda4 100644 --- a/src/test/java/org/elasticsearch/index/mapper/all/mapping_omit_positions_on_all.json +++ b/src/test/java/org/elasticsearch/index/mapper/all/mapping_omit_positions_on_all.json @@ -28,8 +28,7 @@ "properties":{ "location":{ "type":"string", - "store":"yes", - "index_name":"firstLocation" + "store":"yes" } } }, diff --git a/src/test/java/org/elasticsearch/index/mapper/all/noboost-mapping.json b/src/test/java/org/elasticsearch/index/mapper/all/noboost-mapping.json index ecbf315e73ae5..799a3ab460a05 100644 --- a/src/test/java/org/elasticsearch/index/mapper/all/noboost-mapping.json +++ b/src/test/java/org/elasticsearch/index/mapper/all/noboost-mapping.json @@ -27,8 +27,7 @@ "properties":{ "location":{ "type":"string", - "store":"yes", - "index_name":"firstLocation" + "store":"yes" } } }, diff --git a/src/test/java/org/elasticsearch/index/mapper/all/store-mapping.json b/src/test/java/org/elasticsearch/index/mapper/all/store-mapping.json index 7fc9283e06820..8f653a34845b1 100644 --- a/src/test/java/org/elasticsearch/index/mapper/all/store-mapping.json +++ b/src/test/java/org/elasticsearch/index/mapper/all/store-mapping.json @@ -29,8 +29,7 @@ "properties":{ "location":{ "type":"string", - "store":"yes", - "index_name":"firstLocation" + "store":"yes" } } }, diff --git a/src/test/java/org/elasticsearch/index/mapper/path/PathMapperTests.java b/src/test/java/org/elasticsearch/index/mapper/path/PathMapperTests.java index 8d5192683e4b6..f4f02660a32ac 100644 --- a/src/test/java/org/elasticsearch/index/mapper/path/PathMapperTests.java +++ b/src/test/java/org/elasticsearch/index/mapper/path/PathMapperTests.java @@ -39,20 +39,6 @@ public void testPathMapping() throws IOException { String mapping = copyToStringFromClasspath("/org/elasticsearch/index/mapper/path/test-mapping.json"); DocumentMapper docMapper = createIndex("test").mapperService().documentMapperParser().parse(mapping); - assertThat(docMapper.mappers().indexName("first1"), notNullValue()); - assertThat(docMapper.mappers().indexName("name1.first1"), nullValue()); - assertThat(docMapper.mappers().indexName("last1"), nullValue()); - assertThat(docMapper.mappers().indexName("i_last_1"), notNullValue()); - assertThat(docMapper.mappers().indexName("name1.last1"), nullValue()); - assertThat(docMapper.mappers().indexName("name1.i_last_1"), nullValue()); - - assertThat(docMapper.mappers().indexName("first2"), nullValue()); - assertThat(docMapper.mappers().indexName("name2.first2"), notNullValue()); - assertThat(docMapper.mappers().indexName("last2"), nullValue()); - assertThat(docMapper.mappers().indexName("i_last_2"), nullValue()); - assertThat(docMapper.mappers().indexName("name2.i_last_2"), notNullValue()); - assertThat(docMapper.mappers().indexName("name2.last2"), nullValue()); - // test full name assertThat(docMapper.mappers().fullName("first1"), nullValue()); assertThat(docMapper.mappers().fullName("name1.first1"), notNullValue()); diff --git a/src/test/java/org/elasticsearch/index/mapper/path/test-mapping.json b/src/test/java/org/elasticsearch/index/mapper/path/test-mapping.json index 200a45107d380..8af451a0d1faa 100644 --- a/src/test/java/org/elasticsearch/index/mapper/path/test-mapping.json +++ b/src/test/java/org/elasticsearch/index/mapper/path/test-mapping.json @@ -3,27 +3,23 @@ "properties":{ "name1":{ "type":"object", - "path":"just_name", "properties":{ "first1":{ "type":"string" }, "last1":{ - "type":"string", - "index_name":"i_last_1" + "type":"string" } } }, "name2":{ "type":"object", - "path":"full", "properties":{ "first2":{ "type":"string" }, "last2":{ - "type":"string", - "index_name":"i_last_2" + "type":"string" } } } diff --git a/src/test/java/org/elasticsearch/index/mapper/simple/test-mapping.json b/src/test/java/org/elasticsearch/index/mapper/simple/test-mapping.json index 3d7516fa2dbf1..aadbbe408681c 100644 --- a/src/test/java/org/elasticsearch/index/mapper/simple/test-mapping.json +++ b/src/test/java/org/elasticsearch/index/mapper/simple/test-mapping.json @@ -7,7 +7,6 @@ dynamic:false, enabled:true, _id:{ - index_name:"_id" }, _source:{ }, @@ -38,8 +37,7 @@ properties:{ location:{ type:"string", - store:"yes", - index_name:"firstLocation" + store:"yes" } } }, @@ -64,8 +62,7 @@ type:"boolean" }, dogs:{ - type:"string", - index_name:"dog" + type:"string" }, complex:{ type:"object", diff --git a/src/test/java/org/elasticsearch/search/highlight/HighlighterSearchTests.java b/src/test/java/org/elasticsearch/search/highlight/HighlighterSearchTests.java index 51134198f1985..c728062570e2a 100644 --- a/src/test/java/org/elasticsearch/search/highlight/HighlighterSearchTests.java +++ b/src/test/java/org/elasticsearch/search/highlight/HighlighterSearchTests.java @@ -2500,75 +2500,6 @@ public void testPostingsHighlighterManyDocs() throws Exception { } } - @Test //https://github.com/elasticsearch/elasticsearch/issues/4116 - public void testPostingsHighlighterCustomIndexName() { - assertAcked(prepareCreate("test") - .addMapping("type1", "field1", "type=string,index_options=offsets,index_name=my_field")); - ensureGreen(); - - client().prepareIndex("test", "type1", "1").setSource("field1", "First sentence. Second sentence.").get(); - refresh(); - - SearchResponse searchResponse = client().prepareSearch("test").setQuery(matchQuery("field1", "first")).addHighlightedField("field1").get(); - assertHighlight(searchResponse, 0, "field1", 0, 1, equalTo("First sentence.")); - - searchResponse = client().prepareSearch("test").setQuery(matchQuery("my_field", "first")).addHighlightedField("field1").get(); - assertHighlight(searchResponse, 0, "field1", 0, 1, equalTo("First sentence.")); - - searchResponse = client().prepareSearch("test").setQuery(matchQuery("my_field", "first")).addHighlightedField("my_field").get(); - assertHighlight(searchResponse, 0, "my_field", 0, 1, equalTo("First sentence.")); - - searchResponse = client().prepareSearch("test").setQuery(matchQuery("my_field", "first")) - .addHighlightedField("field1").setHighlighterRequireFieldMatch(true).get(); - assertHighlight(searchResponse, 0, "field1", 0, 1, equalTo("First sentence.")); - } - - @Test - public void testFastVectorHighlighterCustomIndexName() { - assertAcked(prepareCreate("test") - .addMapping("type1", "field1", "type=string,term_vector=with_positions_offsets,index_name=my_field")); - ensureGreen(); - - client().prepareIndex("test", "type1", "1").setSource("field1", "First sentence. Second sentence.").get(); - refresh(); - - SearchResponse searchResponse = client().prepareSearch("test").setQuery(matchQuery("field1", "first")).addHighlightedField("field1").get(); - assertHighlight(searchResponse, 0, "field1", 0, 1, equalTo("First sentence. Second sentence.")); - - searchResponse = client().prepareSearch("test").setQuery(matchQuery("my_field", "first")).addHighlightedField("field1").get(); - assertHighlight(searchResponse, 0, "field1", 0, 1, equalTo("First sentence. Second sentence.")); - - searchResponse = client().prepareSearch("test").setQuery(matchQuery("my_field", "first")).addHighlightedField("my_field").get(); - assertHighlight(searchResponse, 0, "my_field", 0, 1, equalTo("First sentence. Second sentence.")); - - searchResponse = client().prepareSearch("test").setQuery(matchQuery("my_field", "first")) - .addHighlightedField("field1").setHighlighterRequireFieldMatch(true).get(); - assertHighlight(searchResponse, 0, "field1", 0, 1, equalTo("First sentence. Second sentence.")); - } - - @Test - public void testPlainHighlighterCustomIndexName() { - assertAcked(prepareCreate("test") - .addMapping("type1", "field1", "type=string,index_name=my_field")); - ensureGreen(); - - client().prepareIndex("test", "type1", "1").setSource("field1", "First sentence. Second sentence.").get(); - refresh(); - - SearchResponse searchResponse = client().prepareSearch("test").setQuery(matchQuery("field1", "first")).addHighlightedField("field1").get(); - assertHighlight(searchResponse, 0, "field1", 0, 1, equalTo("First sentence. Second sentence.")); - - searchResponse = client().prepareSearch("test").setQuery(matchQuery("my_field", "first")).addHighlightedField("field1").get(); - assertHighlight(searchResponse, 0, "field1", 0, 1, equalTo("First sentence. Second sentence.")); - - searchResponse = client().prepareSearch("test").setQuery(matchQuery("my_field", "first")).addHighlightedField("my_field").get(); - assertHighlight(searchResponse, 0, "my_field", 0, 1, equalTo("First sentence. Second sentence.")); - - searchResponse = client().prepareSearch("test").setQuery(matchQuery("my_field", "first")) - .addHighlightedField("field1").setHighlighterRequireFieldMatch(true).get(); - assertHighlight(searchResponse, 0, "field1", 0, 1, equalTo("First sentence. Second sentence.")); - } - @Test public void testFastVectorHighlighterPhraseBoost() throws Exception { assertAcked(prepareCreate("test").addMapping("type1", type1TermVectorMapping())); diff --git a/src/test/java/org/elasticsearch/search/suggest/CompletionSuggestSearchTests.java b/src/test/java/org/elasticsearch/search/suggest/CompletionSuggestSearchTests.java index ddff40e8d5b2b..6f57a335895eb 100644 --- a/src/test/java/org/elasticsearch/search/suggest/CompletionSuggestSearchTests.java +++ b/src/test/java/org/elasticsearch/search/suggest/CompletionSuggestSearchTests.java @@ -487,7 +487,6 @@ public void testThatUpgradeToMultiFieldTypeWorks() throws Exception { .startObject("properties") .startObject(FIELD) .field("type", "string") - .field("path", "just_name") // The path can't be changed / upgraded .endObject() .endObject() .endObject() @@ -500,7 +499,6 @@ public void testThatUpgradeToMultiFieldTypeWorks() throws Exception { .startObject(TYPE).startObject("properties") .startObject(FIELD) .field("type", "multi_field") - .field("path", "just_name") .startObject("fields") .startObject(FIELD).field("type", "string").endObject() .startObject("suggest").field("type", "completion").field("analyzer", "simple").endObject() @@ -520,7 +518,7 @@ public void testThatUpgradeToMultiFieldTypeWorks() throws Exception { ensureGreen(INDEX); SuggestResponse afterReindexingResponse = client().prepareSuggest(INDEX).addSuggestion( - SuggestBuilders.completionSuggestion("suggs").field("suggest").text("f").size(10) + SuggestBuilders.completionSuggestion("suggs").field(FIELD + ".suggest").text("f").size(10) ).execute().actionGet(); assertSuggestions(afterReindexingResponse, "suggs", "Foo Fighters"); } @@ -533,7 +531,6 @@ public void testThatUpgradeToMultiFieldsWorks() throws Exception { .startObject("properties") .startObject(FIELD) .field("type", "string") - .field("path", "just_name") // The path can't be changed / upgraded .endObject() .endObject() .endObject() @@ -546,7 +543,6 @@ public void testThatUpgradeToMultiFieldsWorks() throws Exception { .startObject(TYPE).startObject("properties") .startObject(FIELD) .field("type", "string") - .field("path", "just_name") // Need to specify path again, to make sure that the `path` is known when this mapping is parsed and turned into DocumentMapper that we merge with. .startObject("fields") .startObject("suggest").field("type", "completion").field("analyzer", "simple").endObject() .endObject() @@ -565,7 +561,7 @@ public void testThatUpgradeToMultiFieldsWorks() throws Exception { ensureGreen(INDEX); SuggestResponse afterReindexingResponse = client().prepareSuggest(INDEX).addSuggestion( - SuggestBuilders.completionSuggestion("suggs").field("suggest").text("f").size(10) + SuggestBuilders.completionSuggestion("suggs").field(FIELD + ".suggest").text("f").size(10) ).execute().actionGet(); assertSuggestions(afterReindexingResponse, "suggs", "Foo Fighters"); } diff --git a/src/test/java/org/elasticsearch/search/suggest/SuggestSearchTests.java b/src/test/java/org/elasticsearch/search/suggest/SuggestSearchTests.java index 171c024fe2477..0a049cdd7cb53 100644 --- a/src/test/java/org/elasticsearch/search/suggest/SuggestSearchTests.java +++ b/src/test/java/org/elasticsearch/search/suggest/SuggestSearchTests.java @@ -168,12 +168,11 @@ public void testSuggestModes() throws IOException { .startObject("properties") .startObject("name") .field("type", "multi_field") - .field("path", "just_name") .startObject("fields") .startObject("name") .field("type", "string") .endObject() - .startObject("name_shingled") + .startObject("shingled") .field("type", "string") .field("analyzer", "biword") .field("search_analyzer", "standard") @@ -192,7 +191,7 @@ public void testSuggestModes() throws IOException { refresh(); DirectCandidateGenerator generator = candidateGenerator("name").prefixLength(0).minWordLength(0).suggestMode("always").maxEdits(2); - PhraseSuggestionBuilder phraseSuggestion = phraseSuggestion("did_you_mean").field("name_shingled") + PhraseSuggestionBuilder phraseSuggestion = phraseSuggestion("did_you_mean").field("name.shingled") .addCandidateGenerator(generator) .gramSize(3); Suggest searchSuggest = searchSuggest( "ice tea", phraseSuggestion); @@ -244,12 +243,11 @@ public void testUnmappedField() throws IOException, InterruptedException, Execut .startObject("properties") .startObject("name") .field("type", "multi_field") - .field("path", "just_name") .startObject("fields") .startObject("name") .field("type", "string") .endObject() - .startObject("name_shingled") + .startObject("shingled") .field("type", "string") .field("analyzer", "biword") .field("search_analyzer", "standard") @@ -266,7 +264,7 @@ public void testUnmappedField() throws IOException, InterruptedException, Execut client().prepareIndex("test", "type1").setSource("name", "I like ice cream.")); refresh(); - PhraseSuggestionBuilder phraseSuggestion = phraseSuggestion("did_you_mean").field("name_shingled") + PhraseSuggestionBuilder phraseSuggestion = phraseSuggestion("did_you_mean").field("name.shingled") .addCandidateGenerator(PhraseSuggestionBuilder.candidateGenerator("name").prefixLength(0).minWordLength(0).suggestMode("always").maxEdits(2)) .gramSize(3); Suggest searchSuggest = searchSuggest( "ice tea", phraseSuggestion); @@ -794,7 +792,6 @@ public void testShardFailures() throws IOException, InterruptedException { .startObject("properties") .startObject("name") .field("type", "multi_field") - .field("path", "just_name") .startObject("fields") .startObject("name") .field("type", "string") @@ -840,7 +837,6 @@ public void testEmptyShards() throws IOException, InterruptedException { startObject("properties"). startObject("name"). field("type", "multi_field"). - field("path", "just_name"). startObject("fields"). startObject("name"). field("type", "string"). diff --git a/src/test/resources/org/elasticsearch/bwcompat/index-1.4.2.zip b/src/test/resources/org/elasticsearch/bwcompat/index-1.4.2.zip index 1c654e012dd2615d6e964d7439f70bf4354db0f9..5f0919df6a8c89cb0ce39909636570eaf006826b 100644 GIT binary patch literal 26377 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 EKLWR#p8x;= literal 23872 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 S1Vje-BL^rWQkVMr>Hh%@_`v}H literal 20651 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