in oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/base/StorageEsInstaller.java [322:390]
protected Mappings createMapping(Model model) {
final var properties = new HashMap<String, Object>();
final var source = new Mappings.Source();
for (ModelColumn columnDefine : model.getColumns()) {
final var elasticSearchExtension = columnDefine.getElasticSearchExtension();
final String type = columnTypeEsMapping.transform(columnDefine.getType(), columnDefine.getGenericType(),
columnDefine.getLength(), columnDefine.isStorageOnly(),
elasticSearchExtension);
var columnName = columnDefine.getColumnName().getName();
final var legacyName = elasticSearchExtension.getLegacyColumnName();
final var columnProperties = new HashMap<>();
if (config.isLogicSharding() && !Strings.isNullOrEmpty(legacyName)) {
columnName = legacyName;
}
if (elasticSearchExtension.needMatchQuery()) {
String matchCName = MatchCNameBuilder.INSTANCE.build(columnName);
columnProperties.put("type", type);
columnProperties.put("copy_to", matchCName);
Map<String, Object> matchColumn = new HashMap<>();
matchColumn.put("type", "text");
matchColumn.put("analyzer", elasticSearchExtension.getAnalyzer().getName());
properties.put(matchCName, matchColumn);
} else {
columnProperties.put("type", type);
// no index parameter is allowed for binary type, since ES 8.0
if (columnDefine.isStorageOnly() && !"binary".equals(type)) {
columnProperties.put("index", false);
}
}
if (!"text".equals(type) && !elasticSearchExtension.isDocValuesEnabled()) {
columnProperties.put("doc_values", false);
}
properties.put(columnName, columnProperties);
if (columnDefine.isIndexOnly()) {
source.getExcludes().add(columnName);
}
}
if (!model.isTimeSeries()) {
Map<String, Object> column = new HashMap<>();
column.put("type", "keyword");
properties.put(IndexController.LogicIndicesRegister.MANAGEMENT_TABLE_NAME, column);
}
if ((model.isMetric() && !config.isLogicSharding())
|| (config.isLogicSharding() && IndexController.INSTANCE.isFunctionMetric(model))) {
Map<String, Object> column = new HashMap<>();
column.put("type", "keyword");
properties.put(IndexController.LogicIndicesRegister.METRIC_TABLE_NAME, column);
}
if (!config.isLogicSharding() && model.isRecord() && !model.isSuperDataset()) {
Map<String, Object> column = new HashMap<>();
column.put("type", "keyword");
properties.put(IndexController.LogicIndicesRegister.RECORD_TABLE_NAME, column);
}
Mappings mappings = Mappings.builder()
.type("type")
.properties(properties)
.source(source)
.build();
if (log.isDebugEnabled()) {
log.debug("elasticsearch index template setting: {}", mappings.toString());
}
return mappings;
}