背景
实体类定义属性id
为Long
类型,但在调用 spring-data-elasticsearch:3.2.10.RELEASE
中的putMapping(Class<T>)
方法时却被转换成了keyword
类型
源码
查看putMapping
方法,可以发现最终调用最下边的重载方法
class ElasticsearchRestTemplate {
...
@Override
public <T> boolean putMapping(Class<T> clazz) {
return putMapping(clazz, buildMapping(clazz));
}
@Override
public <T> boolean putMapping(Class<T> clazz, Object mapping) {
return putMapping(getPersistentEntityFor(clazz).getIndexName(), getPersistentEntityFor(clazz).getIndexType(),
mapping);
}
@Override
public <T> boolean putMapping(String indexName, String type, Class<T> clazz) {
return putMapping(indexName, type, buildMapping(clazz));
}
@Override
public boolean putMapping(String indexName, String type, Object mapping) {
Assert.notNull(indexName, "No index defined for putMapping()");
Assert.notNull(type, "No type defined for putMapping()");
PutMappingRequest request = new PutMappingRequest(indexName).type(type);
if (mapping instanceof String) {
request.source(String.valueOf(mapping), XContentType.JSON);
} else if (mapping instanceof Map) {
request.source((Map) mapping);
} else if (mapping instanceof XContentBuilder) {
request.source((XContentBuilder) mapping);
}
try {
return client.indices().putMapping(request, RequestOptions.DEFAULT).isAcknowledged();
} catch (IOException e) {
throw new ElasticsearchException("Failed to put mapping for " + indexName, e);
}
}
...
}
复制代码
查看buildMapping
方法,因为并没有定义外部mappingPath
配置文件,所以走最下边的mappingBuilder.buildPropertyMapping(clazz)
来进行解析出String
类型的json
文件
abstract class AbstractElasticsearchTemplate {
...
protected String buildMapping(Class<?> clazz) {
// load mapping specified in Mapping annotation if present