Index / Index Template: Allow to define `_default_` mapping, closes #542.
This commit is contained in:
parent
e6964f05a8
commit
cfa8c9aa79
|
@ -186,7 +186,19 @@ public class MetaDataCreateIndexService extends AbstractComponent {
|
|||
// now add the mappings
|
||||
IndexService indexService = indicesService.indexServiceSafe(request.index);
|
||||
MapperService mapperService = indexService.mapperService();
|
||||
// first, add the default mapping
|
||||
if (mappings.containsKey(MapperService.DEFAULT_MAPPING)) {
|
||||
try {
|
||||
mapperService.add(MapperService.DEFAULT_MAPPING, XContentFactory.jsonBuilder().map(mappings.get(MapperService.DEFAULT_MAPPING)).string());
|
||||
} catch (Exception e) {
|
||||
indicesService.deleteIndex(request.index);
|
||||
throw new MapperParsingException("mapping [" + MapperService.DEFAULT_MAPPING + "]", e);
|
||||
}
|
||||
}
|
||||
for (Map.Entry<String, Map<String, Object>> entry : mappings.entrySet()) {
|
||||
if (entry.getKey().equals(MapperService.DEFAULT_MAPPING)) {
|
||||
continue;
|
||||
}
|
||||
try {
|
||||
mapperService.add(entry.getKey(), XContentFactory.jsonBuilder().map(entry.getValue()).string());
|
||||
} catch (Exception e) {
|
||||
|
|
|
@ -63,7 +63,7 @@ public class MapperService extends AbstractIndexComponent implements Iterable<Do
|
|||
public static final String DEFAULT_MAPPING = "_default_";
|
||||
|
||||
/**
|
||||
* Will create types automatically if they do not exists in the repo yet
|
||||
* Will create types automatically if they do not exists in the mapping definition yet
|
||||
*/
|
||||
private final boolean dynamic;
|
||||
|
||||
|
@ -151,7 +151,12 @@ public class MapperService extends AbstractIndexComponent implements Iterable<Do
|
|||
public void add(String type, String mappingSource) {
|
||||
if (DEFAULT_MAPPING.equals(type)) {
|
||||
// verify we can parse it
|
||||
documentParser.parse(type, mappingSource);
|
||||
DocumentMapper mapper = documentParser.parse(type, mappingSource);
|
||||
// still add it as a document mapper so we have it registered and, for example, persisted back into
|
||||
// the cluster meta data if needed, or checked for existence
|
||||
synchronized (mutex) {
|
||||
mappers = newMapBuilder(mappers).put(type, mapper).immutableMap();
|
||||
}
|
||||
defaultMappingSource = mappingSource;
|
||||
} else {
|
||||
add(parse(type, mappingSource));
|
||||
|
|
|
@ -218,35 +218,19 @@ public class IndicesClusterStateService extends AbstractLifecycleComponent<Indic
|
|||
String index = indexMetaData.index();
|
||||
IndexService indexService = indicesService.indexServiceSafe(index);
|
||||
MapperService mapperService = indexService.mapperService();
|
||||
// first, go over and update the _default_ mapping (if exists)
|
||||
if (indexMetaData.mappings().containsKey(MapperService.DEFAULT_MAPPING)) {
|
||||
processMapping(event, index, mapperService, MapperService.DEFAULT_MAPPING, indexMetaData.mapping(MapperService.DEFAULT_MAPPING).source());
|
||||
}
|
||||
|
||||
// go over and add the relevant mappings (or update them)
|
||||
for (MappingMetaData mappingMd : indexMetaData.mappings().values()) {
|
||||
String mappingType = mappingMd.type();
|
||||
CompressedString mappingSource = mappingMd.source();
|
||||
if (!seenMappings.containsKey(new Tuple<String, String>(index, mappingType))) {
|
||||
seenMappings.put(new Tuple<String, String>(index, mappingType), true);
|
||||
}
|
||||
|
||||
try {
|
||||
if (!mapperService.hasMapping(mappingType)) {
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("[{}] adding mapping [{}], source [{}]", index, mappingType, mappingSource.string());
|
||||
}
|
||||
mapperService.add(mappingType, mappingSource.string());
|
||||
nodeMappingCreatedAction.nodeMappingCreated(new NodeMappingCreatedAction.NodeMappingCreatedResponse(index, mappingType, event.state().nodes().localNodeId()));
|
||||
} else {
|
||||
DocumentMapper existingMapper = mapperService.documentMapper(mappingType);
|
||||
if (!mappingSource.equals(existingMapper.mappingSource())) {
|
||||
// mapping changed, update it
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("[{}] updating mapping [{}], source [{}]", index, mappingType, mappingSource.string());
|
||||
}
|
||||
mapperService.add(mappingType, mappingSource.string());
|
||||
nodeMappingCreatedAction.nodeMappingCreated(new NodeMappingCreatedAction.NodeMappingCreatedResponse(index, mappingType, event.state().nodes().localNodeId()));
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
logger.warn("[{}] failed to add mapping [{}], source [{}]", e, index, mappingType, mappingSource);
|
||||
if (mappingType.equals(MapperService.DEFAULT_MAPPING)) { // we processed _default_ first
|
||||
continue;
|
||||
}
|
||||
processMapping(event, index, mapperService, mappingType, mappingSource);
|
||||
}
|
||||
// go over and remove mappings
|
||||
for (DocumentMapper documentMapper : mapperService) {
|
||||
|
@ -259,6 +243,34 @@ public class IndicesClusterStateService extends AbstractLifecycleComponent<Indic
|
|||
}
|
||||
}
|
||||
|
||||
private void processMapping(ClusterChangedEvent event, String index, MapperService mapperService, String mappingType, CompressedString mappingSource) {
|
||||
if (!seenMappings.containsKey(new Tuple<String, String>(index, mappingType))) {
|
||||
seenMappings.put(new Tuple<String, String>(index, mappingType), true);
|
||||
}
|
||||
|
||||
try {
|
||||
if (!mapperService.hasMapping(mappingType)) {
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("[{}] adding mapping [{}], source [{}]", index, mappingType, mappingSource.string());
|
||||
}
|
||||
mapperService.add(mappingType, mappingSource.string());
|
||||
nodeMappingCreatedAction.nodeMappingCreated(new NodeMappingCreatedAction.NodeMappingCreatedResponse(index, mappingType, event.state().nodes().localNodeId()));
|
||||
} else {
|
||||
DocumentMapper existingMapper = mapperService.documentMapper(mappingType);
|
||||
if (!mappingSource.equals(existingMapper.mappingSource())) {
|
||||
// mapping changed, update it
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("[{}] updating mapping [{}], source [{}]", index, mappingType, mappingSource.string());
|
||||
}
|
||||
mapperService.add(mappingType, mappingSource.string());
|
||||
nodeMappingCreatedAction.nodeMappingCreated(new NodeMappingCreatedAction.NodeMappingCreatedResponse(index, mappingType, event.state().nodes().localNodeId()));
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
logger.warn("[{}] failed to add mapping [{}], source [{}]", e, index, mappingType, mappingSource);
|
||||
}
|
||||
}
|
||||
|
||||
private void applyNewOrUpdatedShards(final ClusterChangedEvent event) throws ElasticSearchException {
|
||||
if (!indicesService.changesAllowed())
|
||||
return;
|
||||
|
|
Loading…
Reference in New Issue