一、项目背景
springboot整合es,然后用到了ElasticsearchRepository接口,这个接口的作用是可以实现对es进行简单的增删改查操作,它的用法类似于这样:
public interface UniAccountRepository extends ElasticsearchRepository<UniAccount,String> {
}
@NoRepositoryBean
public interface ElasticsearchRepository<T, ID extends Serializable> extends ElasticsearchCrudRepository<T, ID> {
<S extends T> S index(S entity);
Iterable<T> search(QueryBuilder query);
Page<T> search(QueryBuilder query, Pageable pageable);
Page<T> search(SearchQuery searchQuery);
Page<T> searchSimilar(T entity, String[] fields, Pageable pageable);
void refresh();
Class<T> getEntityClass();
}
@Document(indexName = "uniuseraccount",type = "docs", shards = 1, replicas = 0)
public class UniAccount implements Serializable{
private static final long serialVersionUID = -574424362819238356L;
@Field(type = FieldType.keyword)
private Long accountId;
@Id
private String staffCode;
}
接口提供简单查询方法,泛型第一个参数是Model对象,同时也是项目启动时spring自动简历索引时用到的对象,第二个参数是索引的、自己指定ID。
二、问题发现及原因
项目启动到这就自动退出了,根据以往的经验,以为是mybatis的mapper文件有错误导致的,跟了代码检查了提交记录发现没有问题,然后推测问题出现在es上,于是就跟了一下TransportClientFactoryBean的源码。
因为没有任何异常信息打印出来,所以一步一步跟代码后来发现了异常信息被throw出来。
es在建立索引的时候会同时建立mapping关系,并且mapping一旦建好是不能修改的(可以新增),看图中的异常信息可以知道问题出在了springboot项目启动的时候,去建立索引的时候发现跟mapping匹配不上,应该是string类型(keyword),实际上的model中(也就上一中的UniAccount)字段的类型是date所以导致了错误
springboot是通过@EnableElasticsearchRepositories注解来自动建立索引的,用法是在启动类上加上注解,然后注解有个属性是basePackages 用来指定Repository接口所在的包,然后会自动根据泛型的Model类,建立好index。
我的问题就是出现在第二次修改字段的时候,第一次新增字段的时候,spring会往mapping中加入我们新加的字段的信息,然后第二次我把字段改了从string改成了date,然而mapping却改不了,再次启动项目,建立索引的时候,发现mapping跟我的字段类型不一致了,于是就报错了。关键点就在于es的索引的mapping改不了这一个特性。