Spring Data Elasticsearch 4.x官网文档的摘录

yuk1chan / 2023-08-12 / 原文

引用来源:

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
这时候就有两种方案了:

  1. 升级到 JDK17+Springboot3
    个人理解 JDK17 就是未来的大趋势,以及 Springboot3.0 最低要求就是 JDK17
    升级可以让整个项目在未来的很长一段时间保持竞争性,现在遇到的是 es 的新版本不匹配,感觉下一个就是 kafka 的新特性不能兼容了
    又或者会不会 Spring 体系又新增 AI 的组件
  2. 升级到最新的 3.0 以下的 GA 版本(最不容易出错,大概率采用)