mirror of
https://github.com/honeymoose/OpenSearch.git
synced 2025-02-25 06:16:40 +00:00
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
|
// now add the mappings
|
||||||
IndexService indexService = indicesService.indexServiceSafe(request.index);
|
IndexService indexService = indicesService.indexServiceSafe(request.index);
|
||||||
MapperService mapperService = indexService.mapperService();
|
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()) {
|
for (Map.Entry<String, Map<String, Object>> entry : mappings.entrySet()) {
|
||||||
|
if (entry.getKey().equals(MapperService.DEFAULT_MAPPING)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
mapperService.add(entry.getKey(), XContentFactory.jsonBuilder().map(entry.getValue()).string());
|
mapperService.add(entry.getKey(), XContentFactory.jsonBuilder().map(entry.getValue()).string());
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
@ -63,7 +63,7 @@ public class MapperService extends AbstractIndexComponent implements Iterable<Do
|
|||||||
public static final String DEFAULT_MAPPING = "_default_";
|
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;
|
private final boolean dynamic;
|
||||||
|
|
||||||
@ -151,7 +151,12 @@ public class MapperService extends AbstractIndexComponent implements Iterable<Do
|
|||||||
public void add(String type, String mappingSource) {
|
public void add(String type, String mappingSource) {
|
||||||
if (DEFAULT_MAPPING.equals(type)) {
|
if (DEFAULT_MAPPING.equals(type)) {
|
||||||
// verify we can parse it
|
// 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;
|
defaultMappingSource = mappingSource;
|
||||||
} else {
|
} else {
|
||||||
add(parse(type, mappingSource));
|
add(parse(type, mappingSource));
|
||||||
|
@ -218,10 +218,32 @@ public class IndicesClusterStateService extends AbstractLifecycleComponent<Indic
|
|||||||
String index = indexMetaData.index();
|
String index = indexMetaData.index();
|
||||||
IndexService indexService = indicesService.indexServiceSafe(index);
|
IndexService indexService = indicesService.indexServiceSafe(index);
|
||||||
MapperService mapperService = indexService.mapperService();
|
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)
|
// go over and add the relevant mappings (or update them)
|
||||||
for (MappingMetaData mappingMd : indexMetaData.mappings().values()) {
|
for (MappingMetaData mappingMd : indexMetaData.mappings().values()) {
|
||||||
String mappingType = mappingMd.type();
|
String mappingType = mappingMd.type();
|
||||||
CompressedString mappingSource = mappingMd.source();
|
CompressedString mappingSource = mappingMd.source();
|
||||||
|
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) {
|
||||||
|
if (seenMappings.containsKey(new Tuple<String, String>(index, documentMapper.type())) && !indexMetaData.mappings().containsKey(documentMapper.type())) {
|
||||||
|
// we have it in our mappings, but not in the metadata, and we have seen it in the cluster state, remove it
|
||||||
|
mapperService.remove(documentMapper.type());
|
||||||
|
seenMappings.remove(new Tuple<String, String>(index, documentMapper.type()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void processMapping(ClusterChangedEvent event, String index, MapperService mapperService, String mappingType, CompressedString mappingSource) {
|
||||||
if (!seenMappings.containsKey(new Tuple<String, String>(index, mappingType))) {
|
if (!seenMappings.containsKey(new Tuple<String, String>(index, mappingType))) {
|
||||||
seenMappings.put(new Tuple<String, String>(index, mappingType), true);
|
seenMappings.put(new Tuple<String, String>(index, mappingType), true);
|
||||||
}
|
}
|
||||||
@ -248,16 +270,6 @@ public class IndicesClusterStateService extends AbstractLifecycleComponent<Indic
|
|||||||
logger.warn("[{}] failed to add mapping [{}], source [{}]", e, index, mappingType, mappingSource);
|
logger.warn("[{}] failed to add mapping [{}], source [{}]", e, index, mappingType, mappingSource);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// go over and remove mappings
|
|
||||||
for (DocumentMapper documentMapper : mapperService) {
|
|
||||||
if (seenMappings.containsKey(new Tuple<String, String>(index, documentMapper.type())) && !indexMetaData.mappings().containsKey(documentMapper.type())) {
|
|
||||||
// we have it in our mappings, but not in the metadata, and we have seen it in the cluster state, remove it
|
|
||||||
mapperService.remove(documentMapper.type());
|
|
||||||
seenMappings.remove(new Tuple<String, String>(index, documentMapper.type()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void applyNewOrUpdatedShards(final ClusterChangedEvent event) throws ElasticSearchException {
|
private void applyNewOrUpdatedShards(final ClusterChangedEvent event) throws ElasticSearchException {
|
||||||
if (!indicesService.changesAllowed())
|
if (!indicesService.changesAllowed())
|
||||||
|
Loading…
x
Reference in New Issue
Block a user