ES版本 7.x
首先上失效原因
- SpringDataElasticsearch版本变动频繁,很多网上的代码失效,有很多方法标记为过时
- ElasticsearchRestTemplate不读@Filed注解,所以你在@Field里面写再多代码也没用,以下代码为错误示例
@Field(analyzer = "ik_smart", type = FieldType.Text)
private String commentText;
- ElasticsearchRestTemplate在创建索引的时候不读@Mapping,也就是需要两步才能创建完整的索引 1、创建索引 2、更新字段mapping
- ElasticsearchRestTemplate 创建的索引名只读@Document注解,所以必须包含@Document注解,以下代码为错误示例
@Mapping(mappingPath="mapper/document.json")
@Data
public class MyDocument {
@Id
private String id;
private String title;
}
//创建目标索引代码
restTemplate.indexOps(VideoDocument.class).create();
- Mapping.json内,直接说明属性即可,不需要mapping包裹,以下代码为错误示例
{
"mapping":{
"properties": {
"id": {
"type": "text"
},
"title": {
"type": "text",
"analyzer": "ik_smart",
"search_analyzer": "whitespace"
}
}
}
}
原因是源码里,直接将此json作为更新索引的请求体,所以es语法怎么定义就怎么写,不是spring 定义的格式
正确写法:
1、需要@Document注解
2、添加Mapping注解,自己创建一个json文件用来定义字段类型
3、创建索引后需要putMapping,更新字段属性,此时才会读Mapping里面定义的json
4、json文件内为 es更新索引的请求体,直接以properties开头
//Document类定义
@Document(indexName = "video")
@Mapping(mappingPath="mapper/myDocument.json")
public class MyDocument{
@Id
private String id;
private String title;
}
//创建索引 可以指定在postconstruct内
if (!restTemplate.indexOps(MyDocument.class).exists()) {
restTemplate.indexOps(MyDocument.class).create();
restTemplate.indexOps(MyDocument.class).putMapping();
}
{
"properties": {
"id": {
"type": "text"
},
"title": {
"type": "text",
"analyzer": "ik_smart",
"search_analyzer": "whitespace"
}
}
}