Merge pull request #15710 from jpountz/remove/multi_field

Remove support for the `multi_field` type.
This commit is contained in:
Adrien Grand 2015-12-30 15:36:06 +01:00
commit 4c99559df6
12 changed files with 41 additions and 490 deletions

View File

@ -36,7 +36,6 @@ import org.elasticsearch.index.mapper.Mapper;
import org.elasticsearch.index.mapper.MapperParsingException; import org.elasticsearch.index.mapper.MapperParsingException;
import org.elasticsearch.index.mapper.object.ObjectMapper; import org.elasticsearch.index.mapper.object.ObjectMapper;
import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
@ -55,88 +54,6 @@ import static org.elasticsearch.common.xcontent.support.XContentMapValues.nodeSt
*/ */
public class TypeParsers { public class TypeParsers {
public static final String MULTI_FIELD_CONTENT_TYPE = "multi_field";
public static final Mapper.TypeParser multiFieldConverterTypeParser = new Mapper.TypeParser() {
@Override
public Mapper.Builder<?, ?> parse(String name, Map<String, Object> node, ParserContext parserContext) throws MapperParsingException {
FieldMapper.Builder mainFieldBuilder = null;
List<FieldMapper.Builder> fields = null;
String firstType = null;
for (Iterator<Map.Entry<String, Object>> iterator = node.entrySet().iterator(); iterator.hasNext();) {
Map.Entry<String, Object> entry = iterator.next();
String fieldName = Strings.toUnderscoreCase(entry.getKey());
Object fieldNode = entry.getValue();
if (fieldName.equals("fields")) {
Map<String, Object> fieldsNode = (Map<String, Object>) fieldNode;
for (Iterator<Map.Entry<String, Object>> fieldsIterator = fieldsNode.entrySet().iterator(); fieldsIterator.hasNext();) {
Map.Entry<String, Object> entry1 = fieldsIterator.next();
String propName = entry1.getKey();
Map<String, Object> propNode = (Map<String, Object>) entry1.getValue();
String type;
Object typeNode = propNode.get("type");
if (typeNode != null) {
type = typeNode.toString();
if (firstType == null) {
firstType = type;
}
} else {
throw new MapperParsingException("no type specified for property [" + propName + "]");
}
Mapper.TypeParser typeParser = parserContext.typeParser(type);
if (typeParser == null) {
throw new MapperParsingException("no handler for type [" + type + "] declared on field [" + fieldName + "]");
}
if (propName.equals(name)) {
mainFieldBuilder = (FieldMapper.Builder) typeParser.parse(propName, propNode, parserContext);
fieldsIterator.remove();
} else {
if (fields == null) {
fields = new ArrayList<>(2);
}
fields.add((FieldMapper.Builder) typeParser.parse(propName, propNode, parserContext));
fieldsIterator.remove();
}
}
fieldsNode.remove("type");
DocumentMapperParser.checkNoRemainingFields(fieldName, fieldsNode, parserContext.indexVersionCreated());
iterator.remove();
}
}
if (mainFieldBuilder == null) {
if (fields == null) {
// No fields at all were specified in multi_field, so lets return a non indexed string field.
return new StringFieldMapper.Builder(name).index(false);
}
Mapper.TypeParser typeParser = parserContext.typeParser(firstType);
if (typeParser == null) {
// The first multi field's type is unknown
mainFieldBuilder = new StringFieldMapper.Builder(name).index(false);
} else {
Mapper.Builder substitute = typeParser.parse(name, Collections.<String, Object>emptyMap(), parserContext);
if (substitute instanceof FieldMapper.Builder) {
mainFieldBuilder = ((FieldMapper.Builder) substitute).index(false);
} else {
// The first multi isn't a core field type
mainFieldBuilder = new StringFieldMapper.Builder(name).index(false);
}
}
}
if (fields != null) {
for (Mapper.Builder field : fields) {
mainFieldBuilder.addMultiField(field);
}
}
return mainFieldBuilder;
}
};
public static final String DOC_VALUES = "doc_values"; public static final String DOC_VALUES = "doc_values";
public static final String INDEX_OPTIONS_DOCS = "docs"; public static final String INDEX_OPTIONS_DOCS = "docs";
public static final String INDEX_OPTIONS_FREQS = "freqs"; public static final String INDEX_OPTIONS_FREQS = "freqs";

View File

@ -40,7 +40,6 @@ import org.elasticsearch.index.mapper.core.LongFieldMapper;
import org.elasticsearch.index.mapper.core.ShortFieldMapper; import org.elasticsearch.index.mapper.core.ShortFieldMapper;
import org.elasticsearch.index.mapper.core.StringFieldMapper; import org.elasticsearch.index.mapper.core.StringFieldMapper;
import org.elasticsearch.index.mapper.core.TokenCountFieldMapper; import org.elasticsearch.index.mapper.core.TokenCountFieldMapper;
import org.elasticsearch.index.mapper.core.TypeParsers;
import org.elasticsearch.index.mapper.geo.GeoPointFieldMapper; import org.elasticsearch.index.mapper.geo.GeoPointFieldMapper;
import org.elasticsearch.index.mapper.geo.GeoShapeFieldMapper; import org.elasticsearch.index.mapper.geo.GeoShapeFieldMapper;
import org.elasticsearch.index.mapper.internal.AllFieldMapper; import org.elasticsearch.index.mapper.internal.AllFieldMapper;
@ -210,7 +209,6 @@ public class IndicesModule extends AbstractModule {
registerMapper(TokenCountFieldMapper.CONTENT_TYPE, new TokenCountFieldMapper.TypeParser()); registerMapper(TokenCountFieldMapper.CONTENT_TYPE, new TokenCountFieldMapper.TypeParser());
registerMapper(ObjectMapper.CONTENT_TYPE, new ObjectMapper.TypeParser()); registerMapper(ObjectMapper.CONTENT_TYPE, new ObjectMapper.TypeParser());
registerMapper(ObjectMapper.NESTED_CONTENT_TYPE, new ObjectMapper.TypeParser()); registerMapper(ObjectMapper.NESTED_CONTENT_TYPE, new ObjectMapper.TypeParser());
registerMapper(TypeParsers.MULTI_FIELD_CONTENT_TYPE, TypeParsers.multiFieldConverterTypeParser);
registerMapper(CompletionFieldMapper.CONTENT_TYPE, new CompletionFieldMapper.TypeParser()); registerMapper(CompletionFieldMapper.CONTENT_TYPE, new CompletionFieldMapper.TypeParser());
registerMapper(GeoPointFieldMapper.CONTENT_TYPE, new GeoPointFieldMapper.TypeParser()); registerMapper(GeoPointFieldMapper.CONTENT_TYPE, new GeoPointFieldMapper.TypeParser());

View File

@ -112,13 +112,10 @@ public class TokenCountFieldMapperIntegrationIT extends ESIntegTestCase {
.startObject("test") .startObject("test")
.startObject("properties") .startObject("properties")
.startObject("foo") .startObject("foo")
.field("type", "multi_field") .field("type", "string")
.field("store", storeCountedFields)
.field("analyzer", "simple")
.startObject("fields") .startObject("fields")
.startObject("foo")
.field("type", "string")
.field("store", storeCountedFields)
.field("analyzer", "simple")
.endObject()
.startObject("token_count") .startObject("token_count")
.field("type", "token_count") .field("type", "token_count")
.field("analyzer", "standard") .field("analyzer", "standard")

View File

@ -67,10 +67,6 @@ import static org.hamcrest.Matchers.notNullValue;
* *
*/ */
public class MultiFieldTests extends ESSingleNodeTestCase { public class MultiFieldTests extends ESSingleNodeTestCase {
public void testMultiFieldMultiFieldType() throws Exception {
String mapping = copyToStringFromClasspath("/org/elasticsearch/index/mapper/multifield/test-multi-field-type.json");
testMultiField(mapping);
}
public void testMultiFieldMultiFields() throws Exception { public void testMultiFieldMultiFields() throws Exception {
String mapping = copyToStringFromClasspath("/org/elasticsearch/index/mapper/multifield/test-multi-fields.json"); String mapping = copyToStringFromClasspath("/org/elasticsearch/index/mapper/multifield/test-multi-fields.json");
@ -186,224 +182,6 @@ public class MultiFieldTests extends ESSingleNodeTestCase {
assertEquals(IndexOptions.NONE, f.fieldType().indexOptions()); assertEquals(IndexOptions.NONE, f.fieldType().indexOptions());
} }
public void testConvertMultiFieldNoDefaultField() throws Exception {
String mapping = copyToStringFromClasspath("/org/elasticsearch/index/mapper/multifield/test-multi-field-type-no-default-field.json");
DocumentMapper docMapper = createIndex("test").mapperService().documentMapperParser().parse("person", new CompressedXContent(mapping));
BytesReference json = new BytesArray(copyToBytesFromClasspath("/org/elasticsearch/index/mapper/multifield/test-data.json"));
Document doc = docMapper.parse("test", "person", "1", json).rootDoc();
assertNull(doc.getField("name"));
IndexableField f = doc.getField("name.indexed");
assertThat(f.name(), equalTo("name.indexed"));
assertThat(f.stringValue(), equalTo("some name"));
assertThat(f.fieldType().stored(), equalTo(false));
assertNotSame(IndexOptions.NONE, f.fieldType().indexOptions());
f = doc.getField("name.not_indexed");
assertThat(f.name(), equalTo("name.not_indexed"));
assertThat(f.stringValue(), equalTo("some name"));
assertThat(f.fieldType().stored(), equalTo(true));
assertEquals(IndexOptions.NONE, f.fieldType().indexOptions());
assertThat(docMapper.mappers().getMapper("name"), notNullValue());
assertThat(docMapper.mappers().getMapper("name"), instanceOf(StringFieldMapper.class));
assertEquals(IndexOptions.NONE, docMapper.mappers().getMapper("name").fieldType().indexOptions());
assertThat(docMapper.mappers().getMapper("name").fieldType().stored(), equalTo(false));
assertThat(docMapper.mappers().getMapper("name").fieldType().tokenized(), equalTo(true));
assertThat(docMapper.mappers().getMapper("name.indexed"), notNullValue());
assertThat(docMapper.mappers().getMapper("name.indexed"), instanceOf(StringFieldMapper.class));
assertNotNull(docMapper.mappers().getMapper("name.indexed").fieldType().indexOptions());
assertThat(docMapper.mappers().getMapper("name.indexed").fieldType().stored(), equalTo(false));
assertThat(docMapper.mappers().getMapper("name.indexed").fieldType().tokenized(), equalTo(true));
assertThat(docMapper.mappers().getMapper("name.not_indexed"), notNullValue());
assertThat(docMapper.mappers().getMapper("name.not_indexed"), instanceOf(StringFieldMapper.class));
assertEquals(IndexOptions.NONE, docMapper.mappers().getMapper("name.not_indexed").fieldType().indexOptions());
assertThat(docMapper.mappers().getMapper("name.not_indexed").fieldType().stored(), equalTo(true));
assertThat(docMapper.mappers().getMapper("name.not_indexed").fieldType().tokenized(), equalTo(true));
assertNull(doc.getField("age"));
f = doc.getField("age.not_stored");
assertThat(f.name(), equalTo("age.not_stored"));
assertThat(f.numericValue(), equalTo((Number) 28L));
assertThat(f.fieldType().stored(), equalTo(false));
assertNotSame(IndexOptions.NONE, f.fieldType().indexOptions());
f = doc.getField("age.stored");
assertThat(f.name(), equalTo("age.stored"));
assertThat(f.numericValue(), equalTo((Number) 28L));
assertThat(f.fieldType().stored(), equalTo(true));
assertNotSame(IndexOptions.NONE, f.fieldType().indexOptions());
assertThat(docMapper.mappers().getMapper("age"), notNullValue());
assertThat(docMapper.mappers().getMapper("age"), instanceOf(LongFieldMapper.class));
assertEquals(IndexOptions.NONE, docMapper.mappers().getMapper("age").fieldType().indexOptions());
assertThat(docMapper.mappers().getMapper("age").fieldType().stored(), equalTo(false));
assertThat(docMapper.mappers().getMapper("age").fieldType().tokenized(), equalTo(false));
assertThat(docMapper.mappers().getMapper("age.not_stored"), notNullValue());
assertThat(docMapper.mappers().getMapper("age.not_stored"), instanceOf(LongFieldMapper.class));
assertNotSame(IndexOptions.NONE, docMapper.mappers().getMapper("age.not_stored").fieldType().indexOptions());
assertThat(docMapper.mappers().getMapper("age.not_stored").fieldType().stored(), equalTo(false));
assertThat(docMapper.mappers().getMapper("age.not_stored").fieldType().tokenized(), equalTo(false));
assertThat(docMapper.mappers().getMapper("age.stored"), notNullValue());
assertThat(docMapper.mappers().getMapper("age.stored"), instanceOf(LongFieldMapper.class));
assertNotSame(IndexOptions.NONE, docMapper.mappers().getMapper("age.stored").fieldType().indexOptions());
assertThat(docMapper.mappers().getMapper("age.stored").fieldType().stored(), equalTo(true));
assertThat(docMapper.mappers().getMapper("age.stored").fieldType().tokenized(), equalTo(false));
}
public void testConvertMultiFieldGeoPoint() throws Exception {
Version version = VersionUtils.randomVersionBetween(random(), Version.V_1_0_0, Version.CURRENT);
Settings settings = Settings.settingsBuilder().put(IndexMetaData.SETTING_VERSION_CREATED, version).build();
boolean indexCreatedBefore22 = version.before(Version.V_2_2_0);
String mapping = copyToStringFromClasspath("/org/elasticsearch/index/mapper/multifield/test-multi-field-type-geo_point.json");
DocumentMapper docMapper = createIndex("test", settings).mapperService().documentMapperParser().parse("type", new CompressedXContent(mapping));
assertThat(docMapper.mappers().getMapper("a"), notNullValue());
assertThat(docMapper.mappers().getMapper("a"), instanceOf(StringFieldMapper.class));
assertNotSame(IndexOptions.NONE, docMapper.mappers().getMapper("a").fieldType().indexOptions());
assertThat(docMapper.mappers().getMapper("a").fieldType().stored(), equalTo(false));
assertThat(docMapper.mappers().getMapper("a").fieldType().tokenized(), equalTo(false));
assertThat(docMapper.mappers().getMapper("a.b"), notNullValue());
assertThat(docMapper.mappers().getMapper("a.b"), instanceOf(BaseGeoPointFieldMapper.class));
assertNotSame(IndexOptions.NONE, docMapper.mappers().getMapper("a.b").fieldType().indexOptions());
final boolean stored = indexCreatedBefore22 == false;
assertThat(docMapper.mappers().getMapper("a.b").fieldType().stored(), equalTo(stored));
assertThat(docMapper.mappers().getMapper("a.b").fieldType().tokenized(), equalTo(false));
final boolean hasDocValues = indexCreatedBefore22 == false;
assertThat(docMapper.mappers().getMapper("a.b").fieldType().hasDocValues(), equalTo(hasDocValues));
BytesReference json = jsonBuilder().startObject()
.field("a", "-1,-1")
.endObject().bytes();
Document doc = docMapper.parse("test", "type", "1", json).rootDoc();
IndexableField f = doc.getField("a");
assertThat(f, notNullValue());
assertThat(f.name(), equalTo("a"));
assertThat(f.stringValue(), equalTo("-1,-1"));
assertThat(f.fieldType().stored(), equalTo(false));
assertNotSame(IndexOptions.NONE, f.fieldType().indexOptions());
f = doc.getField("a.b");
assertThat(f, notNullValue());
assertThat(f.name(), equalTo("a.b"));
if (indexCreatedBefore22 == true) {
assertThat(f.stringValue(), equalTo("-1.0,-1.0"));
} else {
assertThat(Long.parseLong(f.stringValue()), equalTo(GeoUtils.mortonHash(-1.0, -1.0)));
}
assertThat(f.fieldType().stored(), equalTo(stored));
assertNotSame(IndexOptions.NONE, f.fieldType().indexOptions());
assertThat(docMapper.mappers().getMapper("b"), notNullValue());
assertThat(docMapper.mappers().getMapper("b"), instanceOf(BaseGeoPointFieldMapper.class));
assertNotSame(IndexOptions.NONE, docMapper.mappers().getMapper("b").fieldType().indexOptions());
assertThat(docMapper.mappers().getMapper("b").fieldType().stored(), equalTo(stored));
assertThat(docMapper.mappers().getMapper("b").fieldType().tokenized(), equalTo(false));
assertThat(docMapper.mappers().getMapper("b").fieldType().hasDocValues(), equalTo(hasDocValues));
assertThat(docMapper.mappers().getMapper("b.a"), notNullValue());
assertThat(docMapper.mappers().getMapper("b.a"), instanceOf(StringFieldMapper.class));
assertNotSame(IndexOptions.NONE, docMapper.mappers().getMapper("b.a").fieldType().indexOptions());
assertThat(docMapper.mappers().getMapper("b.a").fieldType().stored(), equalTo(false));
assertThat(docMapper.mappers().getMapper("b.a").fieldType().tokenized(), equalTo(false));
json = jsonBuilder().startObject()
.field("b", "-1,-1")
.endObject().bytes();
doc = docMapper.parse("test", "type", "1", json).rootDoc();
f = doc.getField("b");
assertThat(f, notNullValue());
assertThat(f.name(), equalTo("b"));
if (indexCreatedBefore22 == true) {
assertThat(f.stringValue(), equalTo("-1.0,-1.0"));
} else {
assertThat(Long.parseLong(f.stringValue()), equalTo(GeoUtils.mortonHash(-1.0, -1.0)));
}
assertThat(f.fieldType().stored(), equalTo(stored));
assertNotSame(IndexOptions.NONE, f.fieldType().indexOptions());
f = doc.getField("b.a");
assertThat(f, notNullValue());
assertThat(f.name(), equalTo("b.a"));
assertThat(f.stringValue(), equalTo("-1,-1"));
assertThat(f.fieldType().stored(), equalTo(false));
assertNotSame(IndexOptions.NONE, f.fieldType().indexOptions());
}
public void testConvertMultiFieldCompletion() throws Exception {
String mapping = copyToStringFromClasspath("/org/elasticsearch/index/mapper/multifield/test-multi-field-type-completion.json");
DocumentMapper docMapper = createIndex("test").mapperService().documentMapperParser().parse("type", new CompressedXContent(mapping));
assertThat(docMapper.mappers().getMapper("a"), notNullValue());
assertThat(docMapper.mappers().getMapper("a"), instanceOf(StringFieldMapper.class));
assertNotSame(IndexOptions.NONE, docMapper.mappers().getMapper("a").fieldType().indexOptions());
assertThat(docMapper.mappers().getMapper("a").fieldType().stored(), equalTo(false));
assertThat(docMapper.mappers().getMapper("a").fieldType().tokenized(), equalTo(false));
assertThat(docMapper.mappers().getMapper("a.b"), notNullValue());
assertThat(docMapper.mappers().getMapper("a.b"), instanceOf(CompletionFieldMapper.class));
assertNotSame(IndexOptions.NONE, docMapper.mappers().getMapper("a.b").fieldType().indexOptions());
assertThat(docMapper.mappers().getMapper("a.b").fieldType().stored(), equalTo(false));
assertThat(docMapper.mappers().getMapper("a.b").fieldType().tokenized(), equalTo(true));
BytesReference json = jsonBuilder().startObject()
.field("a", "complete me")
.endObject().bytes();
Document doc = docMapper.parse("test", "type", "1", json).rootDoc();
IndexableField f = doc.getField("a");
assertThat(f, notNullValue());
assertThat(f.name(), equalTo("a"));
assertThat(f.stringValue(), equalTo("complete me"));
assertThat(f.fieldType().stored(), equalTo(false));
assertNotSame(IndexOptions.NONE, f.fieldType().indexOptions());
f = doc.getField("a.b");
assertThat(f, notNullValue());
assertThat(f.name(), equalTo("a.b"));
assertThat(f.stringValue(), equalTo("complete me"));
assertThat(f.fieldType().stored(), equalTo(false));
assertNotSame(IndexOptions.NONE, f.fieldType().indexOptions());
assertThat(docMapper.mappers().getMapper("b"), notNullValue());
assertThat(docMapper.mappers().getMapper("b"), instanceOf(CompletionFieldMapper.class));
assertNotSame(IndexOptions.NONE, docMapper.mappers().getMapper("b").fieldType().indexOptions());
assertThat(docMapper.mappers().getMapper("b").fieldType().stored(), equalTo(false));
assertThat(docMapper.mappers().getMapper("b").fieldType().tokenized(), equalTo(true));
assertThat(docMapper.mappers().getMapper("b.a"), notNullValue());
assertThat(docMapper.mappers().getMapper("b.a"), instanceOf(StringFieldMapper.class));
assertNotSame(IndexOptions.NONE, docMapper.mappers().getMapper("b.a").fieldType().indexOptions());
assertThat(docMapper.mappers().getMapper("b.a").fieldType().stored(), equalTo(false));
assertThat(docMapper.mappers().getMapper("b.a").fieldType().tokenized(), equalTo(false));
json = jsonBuilder().startObject()
.field("b", "complete me")
.endObject().bytes();
doc = docMapper.parse("test", "type", "1", json).rootDoc();
f = doc.getField("b");
assertThat(f, notNullValue());
assertThat(f.name(), equalTo("b"));
assertThat(f.stringValue(), equalTo("complete me"));
assertThat(f.fieldType().stored(), equalTo(false));
assertNotSame(IndexOptions.NONE, f.fieldType().indexOptions());
f = doc.getField("b.a");
assertThat(f, notNullValue());
assertThat(f.name(), equalTo("b.a"));
assertThat(f.stringValue(), equalTo("complete me"));
assertThat(f.fieldType().stored(), equalTo(false));
assertNotSame(IndexOptions.NONE, f.fieldType().indexOptions());
}
// The underlying order of the fields in multi fields in the mapping source should always be consistent, if not this // The underlying order of the fields in multi fields in the mapping source should always be consistent, if not this
// can to unnecessary re-syncing of the mappings between the local instance and cluster state // can to unnecessary re-syncing of the mappings between the local instance and cluster state
public void testMultiFieldsInConsistentOrder() throws Exception { public void testMultiFieldsInConsistentOrder() throws Exception {

View File

@ -233,13 +233,10 @@ public class HighlighterSearchIT extends ESIntegTestCase {
.field("search_analyzer", "search_autocomplete") .field("search_analyzer", "search_autocomplete")
.field("term_vector", "with_positions_offsets") .field("term_vector", "with_positions_offsets")
.endObject() .endObject()
.startObject("name") .endObject()
.field("type", "string") .field("type", "string")
.endObject() .endObject()
.endObject() .endObject()
.field("type", "multi_field")
.endObject()
.endObject()
.endObject()) .endObject())
.setSettings(settingsBuilder() .setSettings(settingsBuilder()
.put(indexSettings()) .put(indexSettings())
@ -900,14 +897,11 @@ public class HighlighterSearchIT extends ESIntegTestCase {
.addMapping("type1", XContentFactory.jsonBuilder().startObject().startObject("type1") .addMapping("type1", XContentFactory.jsonBuilder().startObject().startObject("type1")
.startObject("properties") .startObject("properties")
.startObject("foo") .startObject("foo")
.field("type", "multi_field") .field("type", "string")
.field("termVector", "with_positions_offsets")
.field("store", "yes")
.field("analyzer", "english")
.startObject("fields") .startObject("fields")
.startObject("foo")
.field("type", "string")
.field("termVector", "with_positions_offsets")
.field("store", "yes")
.field("analyzer", "english")
.endObject()
.startObject("plain") .startObject("plain")
.field("type", "string") .field("type", "string")
.field("termVector", "with_positions_offsets") .field("termVector", "with_positions_offsets")
@ -916,14 +910,11 @@ public class HighlighterSearchIT extends ESIntegTestCase {
.endObject() .endObject()
.endObject() .endObject()
.startObject("bar") .startObject("bar")
.field("type", "multi_field") .field("type", "string")
.field("termVector", "with_positions_offsets")
.field("store", "yes")
.field("analyzer", "english")
.startObject("fields") .startObject("fields")
.startObject("bar")
.field("type", "string")
.field("termVector", "with_positions_offsets")
.field("store", "yes")
.field("analyzer", "english")
.endObject()
.startObject("plain") .startObject("plain")
.field("type", "string") .field("type", "string")
.field("termVector", "with_positions_offsets") .field("termVector", "with_positions_offsets")
@ -1194,8 +1185,8 @@ public class HighlighterSearchIT extends ESIntegTestCase {
public void testMultiMapperVectorWithStore() throws Exception { public void testMultiMapperVectorWithStore() throws Exception {
assertAcked(prepareCreate("test") assertAcked(prepareCreate("test")
.addMapping("type1", jsonBuilder().startObject().startObject("type1").startObject("properties") .addMapping("type1", jsonBuilder().startObject().startObject("type1").startObject("properties")
.startObject("title").field("type", "multi_field").startObject("fields") .startObject("title").field("type", "string").field("store", "yes").field("term_vector", "with_positions_offsets").field("analyzer", "classic")
.startObject("title").field("type", "string").field("store", "yes").field("term_vector", "with_positions_offsets").field("analyzer", "classic").endObject() .startObject("fields")
.startObject("key").field("type", "string").field("store", "yes").field("term_vector", "with_positions_offsets").field("analyzer", "whitespace").endObject() .startObject("key").field("type", "string").field("store", "yes").field("term_vector", "with_positions_offsets").field("analyzer", "whitespace").endObject()
.endObject().endObject() .endObject().endObject()
.endObject().endObject().endObject())); .endObject().endObject().endObject()));
@ -1222,8 +1213,8 @@ public class HighlighterSearchIT extends ESIntegTestCase {
public void testMultiMapperVectorFromSource() throws Exception { public void testMultiMapperVectorFromSource() throws Exception {
assertAcked(prepareCreate("test") assertAcked(prepareCreate("test")
.addMapping("type1", jsonBuilder().startObject().startObject("type1").startObject("properties") .addMapping("type1", jsonBuilder().startObject().startObject("type1").startObject("properties")
.startObject("title").field("type", "multi_field").startObject("fields") .startObject("title").field("type", "string").field("store", "no").field("term_vector", "with_positions_offsets").field("analyzer", "classic")
.startObject("title").field("type", "string").field("store", "no").field("term_vector", "with_positions_offsets").field("analyzer", "classic").endObject() .startObject("fields")
.startObject("key").field("type", "string").field("store", "no").field("term_vector", "with_positions_offsets").field("analyzer", "whitespace").endObject() .startObject("key").field("type", "string").field("store", "no").field("term_vector", "with_positions_offsets").field("analyzer", "whitespace").endObject()
.endObject().endObject() .endObject().endObject()
.endObject().endObject().endObject())); .endObject().endObject().endObject()));
@ -1252,8 +1243,8 @@ public class HighlighterSearchIT extends ESIntegTestCase {
public void testMultiMapperNoVectorWithStore() throws Exception { public void testMultiMapperNoVectorWithStore() throws Exception {
assertAcked(prepareCreate("test") assertAcked(prepareCreate("test")
.addMapping("type1", jsonBuilder().startObject().startObject("type1").startObject("properties") .addMapping("type1", jsonBuilder().startObject().startObject("type1").startObject("properties")
.startObject("title").field("type", "multi_field").startObject("fields") .startObject("title").field("type", "string").field("store", "yes").field("term_vector", "no").field("analyzer", "classic")
.startObject("title").field("type", "string").field("store", "yes").field("term_vector", "no").field("analyzer", "classic").endObject() .startObject("fields")
.startObject("key").field("type", "string").field("store", "yes").field("term_vector", "no").field("analyzer", "whitespace").endObject() .startObject("key").field("type", "string").field("store", "yes").field("term_vector", "no").field("analyzer", "whitespace").endObject()
.endObject().endObject() .endObject().endObject()
.endObject().endObject().endObject())); .endObject().endObject().endObject()));
@ -1282,8 +1273,8 @@ public class HighlighterSearchIT extends ESIntegTestCase {
public void testMultiMapperNoVectorFromSource() throws Exception { public void testMultiMapperNoVectorFromSource() throws Exception {
assertAcked(prepareCreate("test") assertAcked(prepareCreate("test")
.addMapping("type1", jsonBuilder().startObject().startObject("type1").startObject("properties") .addMapping("type1", jsonBuilder().startObject().startObject("type1").startObject("properties")
.startObject("title").field("type", "multi_field").startObject("fields") .startObject("title").field("type", "string").field("store", "no").field("term_vector", "no").field("analyzer", "classic")
.startObject("title").field("type", "string").field("store", "no").field("term_vector", "no").field("analyzer", "classic").endObject() .startObject("fields")
.startObject("key").field("type", "string").field("store", "no").field("term_vector", "no").field("analyzer", "whitespace").endObject() .startObject("key").field("type", "string").field("store", "no").field("term_vector", "no").field("analyzer", "whitespace").endObject()
.endObject().endObject() .endObject().endObject()
.endObject().endObject().endObject())); .endObject().endObject().endObject()));
@ -2219,8 +2210,8 @@ public class HighlighterSearchIT extends ESIntegTestCase {
assertAcked(prepareCreate("test") assertAcked(prepareCreate("test")
.addMapping("type1", jsonBuilder().startObject().startObject("type1") .addMapping("type1", jsonBuilder().startObject().startObject("type1")
.startObject("properties") .startObject("properties")
.startObject("title").field("type", "multi_field").startObject("fields") .startObject("title").field("type", "string").field("store", "yes").field("index_options", "offsets").field("analyzer", "classic")
.startObject("title").field("type", "string").field("store", "yes").field("index_options", "offsets").field("analyzer", "classic").endObject() .startObject("fields")
.startObject("key").field("type", "string").field("store", "yes").field("index_options", "offsets").field("analyzer", "whitespace").endObject() .startObject("key").field("type", "string").field("store", "yes").field("index_options", "offsets").field("analyzer", "whitespace").endObject()
.endObject().endObject() .endObject().endObject()
.endObject().endObject().endObject())); .endObject().endObject().endObject()));
@ -2251,8 +2242,8 @@ public class HighlighterSearchIT extends ESIntegTestCase {
public void testPostingsHighlighterMultiMapperFromSource() throws Exception { public void testPostingsHighlighterMultiMapperFromSource() throws Exception {
assertAcked(prepareCreate("test") assertAcked(prepareCreate("test")
.addMapping("type1", jsonBuilder().startObject().startObject("type1").startObject("properties") .addMapping("type1", jsonBuilder().startObject().startObject("type1").startObject("properties")
.startObject("title").field("type", "multi_field").startObject("fields") .startObject("title").field("type", "string").field("store", "no").field("index_options", "offsets").field("analyzer", "classic")
.startObject("title").field("type", "string").field("store", "no").field("index_options", "offsets").field("analyzer", "classic").endObject() .startObject("fields")
.startObject("key").field("type", "string").field("store", "no").field("index_options", "offsets").field("analyzer", "whitespace").endObject() .startObject("key").field("type", "string").field("store", "no").field("index_options", "offsets").field("analyzer", "whitespace").endObject()
.endObject().endObject() .endObject().endObject()
.endObject().endObject().endObject())); .endObject().endObject().endObject()));

View File

@ -601,49 +601,6 @@ public class CompletionSuggestSearchIT extends ESIntegTestCase {
assertSuggestions("r", "Foo Fighters"); assertSuggestions("r", "Foo Fighters");
} }
public void testThatUpgradeToMultiFieldTypeWorks() throws Exception {
final XContentBuilder mapping = jsonBuilder()
.startObject()
.startObject(TYPE)
.startObject("properties")
.startObject(FIELD)
.field("type", "string")
.endObject()
.endObject()
.endObject()
.endObject();
assertAcked(prepareCreate(INDEX).addMapping(TYPE, mapping));
client().prepareIndex(INDEX, TYPE, "1").setRefresh(true).setSource(jsonBuilder().startObject().field(FIELD, "Foo Fighters").endObject()).get();
ensureGreen(INDEX);
PutMappingResponse putMappingResponse = client().admin().indices().preparePutMapping(INDEX).setType(TYPE).setSource(jsonBuilder().startObject()
.startObject(TYPE).startObject("properties")
.startObject(FIELD)
.field("type", "multi_field")
.startObject("fields")
.startObject(FIELD).field("type", "string").endObject()
.startObject("suggest").field("type", "completion").field("analyzer", "simple").endObject()
.endObject()
.endObject()
.endObject().endObject()
.endObject())
.get();
assertThat(putMappingResponse.isAcknowledged(), is(true));
SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion(
new CompletionSuggestionBuilder("suggs").field(FIELD + ".suggest").text("f").size(10)
).execute().actionGet();
assertSuggestions(suggestResponse, "suggs");
client().prepareIndex(INDEX, TYPE, "1").setRefresh(true).setSource(jsonBuilder().startObject().field(FIELD, "Foo Fighters").endObject()).get();
ensureGreen(INDEX);
SuggestResponse afterReindexingResponse = client().prepareSuggest(INDEX).addSuggestion(
SuggestBuilders.completionSuggestion("suggs").field(FIELD + ".suggest").text("f").size(10)
).execute().actionGet();
assertSuggestions(afterReindexingResponse, "suggs", "Foo Fighters");
}
public void testThatUpgradeToMultiFieldsWorks() throws Exception { public void testThatUpgradeToMultiFieldsWorks() throws Exception {
final XContentBuilder mapping = jsonBuilder() final XContentBuilder mapping = jsonBuilder()
.startObject() .startObject()

View File

@ -2,13 +2,10 @@
person:{ person:{
properties:{ properties:{
"name":{ "name":{
type:"multi_field", type:"string",
index:"analyzed",
store:"yes",
"fields":{ "fields":{
"name":{
type:"string",
index:"analyzed",
store:"yes"
},
"indexed":{ "indexed":{
type:"string", type:"string",
index:"analyzed" index:"analyzed"

View File

@ -2,13 +2,10 @@
person:{ person:{
properties:{ properties:{
"name":{ "name":{
type:"multi_field", type:"string",
index:"analyzed",
store:"yes",
"fields":{ "fields":{
"name":{
type:"string",
index:"analyzed",
store:"yes"
},
"indexed":{ "indexed":{
type:"string", type:"string",
index:"analyzed" index:"analyzed"

View File

@ -2,7 +2,8 @@
person:{ person:{
properties:{ properties:{
"name":{ "name":{
type:"multi_field", type:"string",
index:"no",
"fields":{ "fields":{
"not_indexed3":{ "not_indexed3":{
type:"string", type:"string",

View File

@ -1,55 +0,0 @@
{
"person":{
"properties":{
"name":{
"type":"multi_field",
"fields":{
"name":{
"type":"string",
"index":"analyzed",
"store":"yes"
},
"indexed":{
"type":"string",
"index":"analyzed"
},
"not_indexed":{
"type":"string",
"index":"no",
"store":"yes"
},
"test1" : {
"type":"string",
"index":"analyzed",
"store" : "yes",
"fielddata" : {
"loading" : "eager"
}
},
"test2" : {
"type" : "token_count",
"store" : "yes",
"index" : "not_analyzed",
"analyzer" : "simple"
}
}
},
"object1":{
"properties":{
"multi1":{
"type":"multi_field",
"fields":{
"multi1":{
"type":"date"
},
"string":{
"type":"string",
"index":"not_analyzed"
}
}
}
}
}
}
}
}

View File

@ -193,11 +193,8 @@ public class SuggestSearchTests extends ESIntegTestCase {
XContentBuilder mapping = XContentFactory.jsonBuilder().startObject().startObject("type1") XContentBuilder mapping = XContentFactory.jsonBuilder().startObject().startObject("type1")
.startObject("properties") .startObject("properties")
.startObject("name") .startObject("name")
.field("type", "multi_field") .field("type", "string")
.startObject("fields") .startObject("fields")
.startObject("name")
.field("type", "string")
.endObject()
.startObject("shingled") .startObject("shingled")
.field("type", "string") .field("type", "string")
.field("analyzer", "biword") .field("analyzer", "biword")
@ -267,11 +264,8 @@ public class SuggestSearchTests extends ESIntegTestCase {
XContentBuilder mapping = XContentFactory.jsonBuilder().startObject().startObject("type1") XContentBuilder mapping = XContentFactory.jsonBuilder().startObject().startObject("type1")
.startObject("properties") .startObject("properties")
.startObject("name") .startObject("name")
.field("type", "multi_field") .field("type", "string")
.startObject("fields") .startObject("fields")
.startObject("name")
.field("type", "string")
.endObject()
.startObject("shingled") .startObject("shingled")
.field("type", "string") .field("type", "string")
.field("analyzer", "biword") .field("analyzer", "biword")
@ -808,13 +802,8 @@ public class SuggestSearchTests extends ESIntegTestCase {
XContentBuilder mapping = XContentFactory.jsonBuilder().startObject().startObject("type2") XContentBuilder mapping = XContentFactory.jsonBuilder().startObject().startObject("type2")
.startObject("properties") .startObject("properties")
.startObject("name") .startObject("name")
.field("type", "multi_field") .field("type", "string")
.startObject("fields") .field("analyzer", "suggest")
.startObject("name")
.field("type", "string")
.field("analyzer", "suggest")
.endObject()
.endObject()
.endObject() .endObject()
.endObject() .endObject()
.endObject().endObject(); .endObject().endObject();
@ -855,13 +844,8 @@ public class SuggestSearchTests extends ESIntegTestCase {
startObject("type1"). startObject("type1").
startObject("properties"). startObject("properties").
startObject("name"). startObject("name").
field("type", "multi_field"). field("type", "string").
startObject("fields"). field("analyzer", "suggest").
startObject("name").
field("type", "string").
field("analyzer", "suggest").
endObject().
endObject().
endObject(). endObject().
endObject(). endObject().
endObject(). endObject().

View File

@ -35,15 +35,6 @@
test_type: test_type:
properties: properties:
text1: text1:
type: multi_field
fields:
text1:
type: string
analyzer: whitespace
text_raw:
type: string
index: not_analyzed
text2:
type: string type: string
analyzer: whitespace analyzer: whitespace
fields: fields:
@ -58,5 +49,3 @@
- match: {test_index.mappings.test_type.properties.text1.type: string} - match: {test_index.mappings.test_type.properties.text1.type: string}
- match: {test_index.mappings.test_type.properties.text1.fields.text_raw.index: not_analyzed} - match: {test_index.mappings.test_type.properties.text1.fields.text_raw.index: not_analyzed}
- match: {test_index.mappings.test_type.properties.text2.type: string}
- match: {test_index.mappings.test_type.properties.text2.fields.text_raw.index: not_analyzed}