-
spring data elasticsearch算是springboot操作es的一种选择。下面简单介绍下,使用spring data elasticsearch 如何进行数据的增删改查
-
entity构建。此处主要借助了两个注解,@Data是lombok注解,可以帮你生成getter,setter之类的基本方法这里不再赘述。对于es中object对象类型的字段,推荐搭建可以写内部类去定义,如果有很多公共格式的object类型字段,例如User中的BaseInfo。
@Data
@Document(indexName="index_user", type = "type_user", createIndex=false)
public class UserEntity{
private String userName;
private String types;
private BaseInfo userBaseInfo;
@Data
public static class BaseInfo {
private String sex;
private String birthday;
}
}
- 如果你的字段名称在es索引mapping中字母大写(可能全大写可能首字母大写),为了使用repo中的方法你可能需要这么设定下序列化与反序列化时的键值,属性上增加jsonProperty注解,用于spring data es查询出数据后反序列化为userEntity时指定字段属性,这样es中查询出的记录就能够顺利的反序列化成对象,比如你有个查询用户信息的接口,还应该加上JsonIgnore,用于在controller层返回数据到前端时 做序列化时忽略 字段属性,不然就会出现返回的数据既有大写又有小写,默认使用的都是jackjson做序列化与反序列化
- 如果你要使用repo中的CRUD方法,官方强调,CRUD api只适用于单索引结构的集群,所以如果你的集群中有alias,并且存在read,write之类的别名,建议不要使用repo中的增删改查,可以借助elasticTemplate中的其他api实现指定索引,类型完成增删改查。
@Data
@Document(...)
public class UserExEntity{
@JsonProperty("YHM")
private String yhm;
@JsonProperty("ZHMM")
private String zhmm;
@JsonIgnore
public Stirng getYhm() {
return yhm;
}
@JsonIgnore
public Stirng getzhmm() {
return yhm;
}
}
- UserRepo。定义一个空接口即可。或者你可以实现一些你的接口,但是我个人认为没有必要。
public interface Userrepo extends ElasticsearchRepotiory<User,String> {
}
- 简单查询过滤字段排序,返回分页结果
@service
public class YourUserServiceImpl {
@Autowired
ElasticsearchTemplate elasticsearchTemplate;
public List<UserEntity> getUserInfo() {
List<UserEntity> result = new ArrayList();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(QueryBuilders.termQuery(”YHM", "xx"));
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
// 注意这里withQuery是替换nativeSearchQueryBuilder中的query,如果你有多个query,最好整合一个再withQuery
nativeSearchQueryBuilder.withQuery(boolQueryBuilder);
// 排序与分页,排序这里多个字段再增加一条记录即可,分页这里0代表第一页,8代表每页8调数据。这里查询的是0到8条数据,如果需要查询第二页,应该传参(1,8)
nativeSearchQueryBuilder.withPageable(PageRequest.of(0, 8));
nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort("FBSJ").order(SortOrder.DESC));
// 这里不设置的话,下方查询会默认使用entity上@Document注解设置的索引名称和类型名称
nativeSearchQueryBuilder.withIndices("设置es索引名称或者别名");
nativeSearchQueryBuilder.withTypes("设置ES索引类型");
// 这里有queryForList,你也可以使用QueryForPage,里面有总数之类的扩展字段
result = elasticsearchTemplate.queryForList(nativeSearchQueryBuilder.build(), News.class);
}
}
网友评论