Spring Data Elasticsearch 4.x官网文档的摘录
引用来源:
https://docs.spring.io/spring-data/elasticsearch/docs/4.4.14/reference/html/#preface.metadata
为什么要做这种 Copy
最近项目中也在做 es 的接入,一方面是学习过程的记录,另一方面也会补充项目在接入 es 时遇到的一些坑
官网提供的一些值得记录的示例
分页:
public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> {
Iterable<T> findAll(Sort sort);
Page<T> findAll(Pageable pageable);
}
PagingAndSortingRepository<User, Long> repository = // … get access to a bean
Page<User> users = repository.findAll(PageRequest.of(1, 20));
Page<User> findByLastname(String lastname, Pageable pageable);
Slice<User> findByLastname(String lastname, Pageable pageable);
List<User> findByLastname(String lastname, Sort sort);
List<User> findByLastname(String lastname, Pageable pageable);
自定义简单查询:
官网列举关键字:
https://docs.spring.io/spring-data/elasticsearch/docs/4.4.14/reference/html/#elasticsearch.query-methods
// 这句话的含义是根据 Lastname 匹配,lastname 是 person 类里面的一个字段,只需要定义接口,不需要写实现
// 相当于 es 的语义为{"bool" : {"must" : {"field" :{"name" : "?"}}}}
interface PersonRepository extends Repository<Person, Long> {
List<Person> findByLastname(String lastname);
}
interface PersonRepository extends Repository<Person, Long> {
List<Person> findByEmailAddressAndLastname(EmailAddress emailAddress, String lastname);
// Enables the distinct flag for the query
List<Person> findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname);
List<Person> findPeopleDistinctByLastnameOrFirstname(String lastname, String firstname);
// Enabling ignoring case for an individual property
List<Person> findByLastnameIgnoreCase(String lastname);
// Enabling ignoring case for all suitable properties
List<Person> findByLastnameAndFirstnameAllIgnoreCase(String lastname, String firstname);
// Enabling static ORDER BY for a query
List<Person> findByLastnameOrderByFirstnameAsc(String lastname);
List<Person> findByLastnameOrderByFirstnameDesc(String lastname);
}
嵌套查询
// 此处 ZipCode 是 Person 类包含的 Address 类里面的一个类
List<Person> findByAddressZipCode(ZipCode zipCode);
// 但是这样有可能会出现问题 假设 Person 类里面的属性是 AddressZip类这样就出错了 可以采用下划线分割的方式
List<Person> findByAddress_ZipCode(ZipCode zipCode);
排序:
// example1
Sort sort = Sort.by("firstname").ascending()
.and(Sort.by("lastname").descending());
//example2
TypedSort<Person> person = Sort.sort(Person.class);
Sort sort = person.by(Person::getFirstname).ascending()
.and(person.by(Person::getLastname).descending());
//如何又排序又分页呢
关于 NPE:
之前看到一个国外视频讲述关于 Optional 的用法 感觉说的还是蛮好的
他指出Optional 更适合在返回值处包装出参,这样可以有意识的提醒调用方此处可能会返回空对象
https://www.bilibili.com/video/BV1kc411L7QF
package com.acme; (1)
import org.springframework.lang.Nullable;
interface UserRepository extends Repository<User, Long> {
User getByEmailAddress(EmailAddress emailAddress); (2)
@Nullable
User findByEmailAddress(@Nullable EmailAddress emailAdress); (3)
Optional<User> findOptionalByEmailAddress(EmailAddress emailAddress); (4)
}
遇到的坑以及解决方式
1.项目的Springboot 版本不够
虽然是新项目,但是目前系统的spring 的包还是继承的整个项目组的主 pom(boot 的版本还是 2.2.7,之前尝试升级过,但是依赖的其他项目出现冲突,所以搁浅)
而接入的 ES 版本是 7.9.3 最低依赖是 Springboot 2.4.x
这时候就有两种方案了:
- 升级到 JDK17+Springboot3
个人理解 JDK17 就是未来的大趋势,以及 Springboot3.0 最低要求就是 JDK17
升级可以让整个项目在未来的很长一段时间保持竞争性,现在遇到的是 es 的新版本不匹配,感觉下一个就是 kafka 的新特性不能兼容了
又或者会不会 Spring 体系又新增 AI 的组件 - 升级到最新的 3.0 以下的 GA 版本(最不容易出错,大概率采用)