Spring-Data-Elasticsearch

简介

Spring Data for Elasticsearch 是 Spring Data 项目的一部分,该项目旨在为新数据存储提供熟悉且一致的基于 Spring 的编程模型,同时保留特定于存储的特性和功能。

Spring Data Elasticsearch 项目提供了与 Elasticsearch 搜索引擎的集成。Spring Data Elasticsearch 的关键功能领域是以 POJO 为中心的模型,用于与 Elastichsearch 文档交互并轻松编写存储库样式的数据访问层。

简单使用

1.创建SpringBoot项目,导入Spring Data Elasticsearch的起步依赖。

/*elasticsearch的起步依赖*/ 
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

/*lomobok起步依赖*/
 <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
</dependency>

2.编写配置文件,连接ElasticSearch

spring:
  elasticsearch:
    uris: https://192.168.66.101:9200
    username: elastic
    password: 12345678

 打印日志 

logging: pattern: console: '%d{HH:mm:ss.SSS} %clr(%-5level) --- [%-15thread] %cyan(%-50logger{50}):%msg%n'

ES8 开始,访问 ES 的协议从 http 变成了 https ,访问 https 请求 需要SSL 证书,在开发环境下我们不需要配置该证书,在项目中 添加一个配置类,跳过SSL 证书检查即可。

3.创建配置类跳过SSL证书检查 

@Component
public class RestClientBuilderCustomizerImpl implements RestClientBuilderCustomizer {


    @Override
    public void customize(RestClientBuilder builder) {
    }

    /**
     * 跳过SSL的证书检查
     */
    @Override
    public void customize(HttpAsyncClientBuilder builder) {
        SSLContextBuilder sscb = SSLContexts.custom();
        try {
            sscb.loadTrustMaterial((chain, authType) -> {
                return true;
            });
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        } catch (KeyStoreException e) {
            throw new RuntimeException(e);
        }

        try {
            builder.setSSLContext(sscb.build());
        } catch (KeyManagementException | NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }
}

 4.创建实体类

一个实体类的所有对象都会存入 ES 的一个索引中,所以我们在创建实体类时关联ES 索引
@Document(indexName = "product",createIndex = true)  //关联名为product的索引
@Data
@AllArgsConstructor
public class Product {
    @Id //标记在成员变量上,标记一个字段为主键,该字段的值会同步到ES该文档的id值
    //标记在成员变量上,标记为文档中的域,一般有如下属性->
  // type域的类型,index是否创建索引,store是否单独存储,analyzer分词器,searchAnalyzer搜索分词器
    @Field(type = FieldType.Integer,store = true,index = true)
    private Integer id;
    @Field(type = FieldType.Text,store = true,index = true,analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")
    private String productName;
    @Field(type = FieldType.Text,store = true,index = true,analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")
    private String productDesc;
}

 5.创建Repository接口

Repository 接口继承 ElasticsearchRepository, 该接口提供了文档的增删改查方法
@Repository
public interface ProductRepository extends ElasticsearchRepository<Product,Integer> {
}

6.测试Repository接口

6.1测试保存和修改方法

@SpringBootTest
public class ProductRepositoryTest {
    @Autowired
    private ProductRepository repository;
    //保存文档
    public void addProduct(){
        Product product = new Product(1, "今天是第一天", "第一天plus");
        repository.save(product);
    }
   //修改方法(当该文档已经存在,即对其进行修改)
   public void addProduct(){
        Product product = new Product(1, "今天是第first天", "第first天plus");
        repository.save(product);
    }
}

6.2查找文档方法

6.2.1根据id进行查询
@Test
    public void findById(){
        Optional<Product> byId = repository.findById(1);
        System.out.println(byId.get());
    }
6.2.2查询所有文档
@Test
    public void findAll(){
        repository.findAll().forEach(System.out::println);
    }

6.3测试删除方法

//根据其主键id进行删除
@Test
    public void deleteById(){
        repository.deleteById(1);
    }

7.使用DSL语句查询文档

query 后的 json 对象称为 DSL语句 ,我们可以在接口方法上使用 @Query注解自定义 DSL 语句查询。

 在Repository接口层编写方法

7.1 匹配查询

@Repository
public interface ProductRepository extends ElasticsearchRepository<Product,Integer> {
    //匹配查询
    @Query("{\n" +
            "    \"match\": {\n" +
            "      \"productDesc\": \"?0\"\n" +
            "    }\n" +
            "  }")
    List<Product> findByProductDescMatch(String keyword);
}

7.2模糊查询

@Repository
public interface ProductRepository extends ElasticsearchRepository<Product,Integer> {
     @Query(" {\n" +
            "    \"match\": {\n" +
            "      \"productDesc\":{\n" +
            "        \"query\": \"\\?0\",\n" +
            "        \"fuzziness\": 1\n" +
            "      }\n" +
            "    }\n" +
            "  }")
    List<Product> findByProductDescFuzzy(String keyword);
}

8.按照规则命名方法查询文档

 1.只需在 Repository 接口中按照一定的规则命名方法,该方法就能完成相应的查询
 2. 规则:查询方法以 findBy 开头,涉及查询条件时,条件的属性用条件关键字连接。

8.1单条件查询

@Repository
public interface ProductRepository extends ElasticsearchRepository<Product,Integer> {
    //根据规则进行查询-通过productName
    List<Product> findByProductName(String productName);
}

测试:

@Test
    public void testFindByProductName(){
        List<Product> byProductName = repository.findByProductName("iphone");
         byProductName.forEach(System.out::println);
    }

8.2 多条件选择查询

@Repository
public interface ProductRepository extends ElasticsearchRepository<Product,Integer> {
//测试按照规则命名使用    Or 查询
List<Product> findByProductNameOrProductDesc(String productName,String productDesc);
}

测试:

@Test
    public void testFindByProductNameOrProductDesc(){
        repository.findByProductNameOrProductDesc("iphone","三体").forEach(System.out::println);
    }

8.3范围查询

@Repository
public interface ProductRepository extends ElasticsearchRepository<Product,Integer> {
 //测试使用命名规则进行  范围查询
List<Product> findByIdBetween(Integer start,Integer end);
}

测试:

@Test
    public void testFindByProductIdBetween(){
        repository.findByIdBetween(1,3).forEach(System.out::println);
    }

9.分页查询

在使用继承或自定义的方法时,在方法中添加 Pageable 类型的参 数,返回值为Page 类型即可进行分页查询。

9.1继承方法

@Test
    public void testFindPage(){
        //参数1:当前页,从0开始,参数2:每页显示多少条
        Pageable pageable = PageRequest.of(0,3);
        Page<Product> all = repository.findAll(pageable);
        System.out.println("总条数:"+all.getTotalElements());
        System.out.println("总页数:"+all.getTotalPages());
        System.out.println("数据:"+all.getContent());
    }

10.分页查询并排序

10.1继承方法

使用继承或自定义的方法时,在方法中添加 Sort 类型的参数即可进行结果排序。
 @Test
    public void testFindPage2(){
        //既分页,又排序
        Sort sort = Sort.by(Sort.Direction.DESC, "id");
        Pageable pageable = PageRequest.of(0,3,sort);
        Page<Product> all = repository.findByProductDescMatch("体",pageable);
        System.out.println("总条数:"+all.getTotalElements());
        System.out.println("总页数:"+all.getTotalPages());
        System.out.println("数据:"+all.getContent());
    }

相关推荐

  1. Spring-Data-Elasticsearch

    2024-07-12 00:52:03       28 阅读
  2. Elasticsearch Spring Data集成-05

    2024-07-12 00:52:03       41 阅读
  3. Spring Data访问Elasticsearch----Elasticsearch对象映射

    2024-07-12 00:52:03       41 阅读
  4. Spring Data访问Elasticsearch----Elasticsearch审计Auditing

    2024-07-12 00:52:03       42 阅读
  5. Spring Data访问Elasticsearch----查询方法

    2024-07-12 00:52:03       45 阅读
  6. Spring Data访问Elasticsearch----CDI集成

    2024-07-12 00:52:03       35 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-12 00:52:03       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-12 00:52:03       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-12 00:52:03       58 阅读
  4. Python语言-面向对象

    2024-07-12 00:52:03       69 阅读

热门阅读

  1. npm ERR! code ENOTEMPTY npm ERR! syscall rename npm ERR!

    2024-07-12 00:52:03       23 阅读
  2. sizeof()

    2024-07-12 00:52:03       24 阅读
  3. Python 四种字符串格式化方式

    2024-07-12 00:52:03       23 阅读
  4. 存取款系统接口设计

    2024-07-12 00:52:03       20 阅读
  5. SpringBoot 自定义异常返回数据格式

    2024-07-12 00:52:03       21 阅读
  6. ubuntu 安装cups和爱普生打印机

    2024-07-12 00:52:03       20 阅读
  7. 服务器怎么进PE系统?

    2024-07-12 00:52:03       25 阅读
  8. 还在代码中写HttpUtil?是时候说再见啦

    2024-07-12 00:52:03       24 阅读
  9. selenium常用方法

    2024-07-12 00:52:03       24 阅读
  10. (九)Docker 的网络通信

    2024-07-12 00:52:03       22 阅读
  11. 【力扣】每日一题—第242题,有效的字母异位词

    2024-07-12 00:52:03       20 阅读