spring-data-elasticsearch官方文档解读(部分)

Spring Data Elasticsearch

这里主要学习的是4.4.16版本的文档

1. 版本

下表显示了 Spring Data 发行版系列使用的 Elasticsearch 版本和其中包含的 Spring Data Elasticsearch 版本,以及引用该特定 Spring Data 发行版系列的 Spring Boot 版本。给出的 Elasticsearch 版本显示了 Spring Data Elasticsearch 是使用哪些客户端库构建和测试的。

|---------------------------|----------------------------------------------------------------------------------------------------------------|---------------|------------------|-------------|
| Spring Data Release Train | Spring Data Elasticsearch | Elasticsearch | Spring Framework | Spring Boot |
| 2023.0 (Ullmann) | 5.1.x | 8.7.1 | 6.0.x | 3.1.x |
| 2022.0 (Turing) | 5.0.x | 8.5.3 | 6.0.x | 3.0.x |
| 2021.2 (Raj) | 4.4.x[1] | 7.17.3 | 5.3.x | 2.7.x |
| 2021.1 (Q) | 4.3.x[1] | 7.15.2 | 5.3.x | 2.6.x |
| 2021.0 (Pascal) | 4.2.x[1] | 7.12.0 | 5.3.x | 2.5.x |
| 2020.0 (Ockham) | 4.1.x[1] | 7.9.3 | 5.3.2 | 2.4.x |
| Neumann | 4.0.x[1] | 7.6.2 | 5.2.12 | 2.3.x |
| Moore | 3.2.x[1] | 6.8.12 | 5.2.12 | 2.2.x |
| Lovelace | 3.1.x[1] | 6.2.2 | 5.1.19 | 2.1.x |
| Kay | 3.0.x[1] | 5.5.0 | 5.0.13 | 2.0.x |
| Ingalls | 2.1.x[1] | 2.4.0 | 4.3.25 | 1.5.x |

2. Working with Spring Data Repositories

1. Repositories

Spring Data Elasticsearch - Reference Documentation

Spring Data的repository抽象的中心接口是Repository,它是一个泛型接口,需要指定domain类和唯一标识的类型。该接口主要充当标记接口,用于捕获要使用的类型并帮助您发现扩展该接口的接口。

  • CrudRepository接口为管理的实体类提供了复杂的CRUD操作
  • PagingAndSortingRepository接口在CRUD的基础上,增加了分页查询和排序功能

Spring Data Elasticsearch - Reference Documentation

2.1. Query methods

2.1.1. Query creation

自定义接口并继承ElasticsearchRepository接口,通过定义的方法名就能自动创建各种查询。

例子:

interface BookRepository extends Repository<Book, String> {
  List<Book> findByNameAndPrice(String name, Integer price);
}

The method name above will be translated into the following Elasticsearch json query:

{
    "query": {
        "bool" : {
            "must" : [
                { "query_string" : { "query" : "?", "fields" : [ "name" ] } },
                { "query_string" : { "query" : "?", "fields" : [ "price" ] } }
            ]
        }
    }
}

Supported keywords inside method names :

|---------------------|--------------------------------------------|----------------------------------------------------------------------------------------------------------------------|
| Keyword | Sample | Elasticsearch Query String |
| And | findByNameAndPrice | {"bool" : {"must" : [ {"field" : {"name" : "?"}}, {"field" : {"price" : "?"}} ]}} |
| Or | findByNameOrPrice | {"bool" : {"should" : [ {"field" : {"name" : "?"}}, {"field" : {"price" : "?"}} ]}} |
| Is | findByName | {"bool" : {"must" : {"field" : {"name" : "?"}}}} |
| Not | findByNameNot | {"bool" : {"must_not" : {"field" : {"name" : "?"}}}} |
| Between | findByPriceBetween | {"bool" : {"must" : {"range" : {"price" : {"from" : ?,"to" : ?,"include_lower" : true,"include_upper" : true}}}}} |
| LessThanEqual | findByPriceLessThan | {"bool" : {"must" : {"range" : {"price" : {"from" : null,"to" : ?,"include_lower" : true,"include_upper" : true}}}}} |
| GreaterThanEqual | findByPriceGreaterThan | {"bool" : {"must" : {"range" : {"price" : {"from" : ?,"to" : null,"include_lower" : true,"include_upper" : true}}}}} |
| Before | findByPriceBefore | {"bool" : {"must" : {"range" : {"price" : {"from" : null,"to" : ?,"include_lower" : true,"include_upper" : true}}}}} |
| After | findByPriceAfter | {"bool" : {"must" : {"range" : {"price" : {"from" : ?,"to" : null,"include_lower" : true,"include_upper" : true}}}}} |
| Like | findByNameLike | {"bool" : {"must" : {"field" : {"name" : {"query" : "?*","analyze_wildcard" : true}}}}} |
| StartingWith | findByNameStartingWith | {"bool" : {"must" : {"field" : {"name" : {"query" : "?*","analyze_wildcard" : true}}}}} |
| EndingWith | findByNameEndingWith | {"bool" : {"must" : {"field" : {"name" : {"query" : "*?","analyze_wildcard" : true}}}}} |
| Contains/Containing | findByNameContaining | {"bool" : {"must" : {"field" : {"name" : {"query" : "*?*","analyze_wildcard" : true}}}}} |
| In | findByNameIn(Collection<String>names) | {"bool" : {"must" : {"bool" : {"should" : [ {"field" : {"name" : "?"}}, {"field" : {"name" : "?"}} ]}}}} |
| NotIn | findByNameNotIn(Collection<String>names) | {"bool" : {"must_not" : {"bool" : {"should" : {"field" : {"name" : "?"}}}}}} |
| Near | findByStoreNear | Not Supported Yet ! |
| True | findByAvailableTrue | {"bool" : {"must" : {"field" : {"available" : true}}}} |
| False | findByAvailableFalse | {"bool" : {"must" : {"field" : {"available" : false}}}} |
| OrderBy | findByAvailableTrueOrderByNameDesc | {"sort" : [{ "name" : {"order" : "desc"} }],"bool" : {"must" : {"field" : {"available" : true}}}} |

通过方法名派生的查询可能导致可读性降低,也可以实现@Query注解声明query。

如:

interface BookRepository extends ElasticsearchRepository<Book, String> {
    @Query("{\"match\": {\"name\": {\"query\": \"?0\"}}}")
    Page<Book> findByName(String name,Pageable pageable);
}

2.1.2. Method return types

为了返回多个元素,Repository接口方法可被定义为如下返回值类型

  • List<T>
  • Stream<T>
  • SearchHits<T>
  • List<SearchHit<T>>
  • Stream<SearchHit<T>>
  • SearchPage<T>

3. Elasticsearch Object Mapping

Spring Data Elasticsearch - Reference Documentation

Spring Data Elasticsearch 对象映射是将 Java 对象(域实体)映射到存储在 Elasticsearch 中的 JSON 表示形式并映射回来的过程。

3.1. Mapping Annotation

MappingElasticsearchConverter使用元数据来驱动对象到文档的映射,元数据取自被注解的实体属性。

如下是常用的注解:

|-----------|-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 注解 | 用途 | 常用参数 |
| @Document | 在类级别应用以指示该类是映射到数据库的候选类。 | indexName:存储该实体类的ES index createIndex createIndex:是否自动创建索引,默认为true |
| @Id | 应用于字段上,标记该字段为唯一标识 | 无参数 |
| @Field | 应用于字段上,定义字段的属性 | name:该字段在ES中的名称,默认为Java实体类字段名 type:文档中字段的类型,类型很多,具体参考官网,常用的有:Text, Keyword, Long, Integer, Short, Byte, Double, Float, Boolean, Date store: Flag whether the original field value should be store in Elasticsearch, default value is false. analyzer:分词器 |
| @Setting | 索引设置 | Spring Data Elasticsearch - Reference Documentation shards:分片数,默认为1 replicas:副本数量,默认为1 |

4. 配置

4.1. 使用配置类

@Configuration
@EnableElasticsearchRepositories(basePackages = "org.springframework.data.elasticsearch.repository")
public class ElasticsearchConfiguration extends AbstractElasticsearchConfiguration {
    @Override
    @Bean
    public RestHighLevelClient elasticsearchClient() {

        final ClientConfiguration clientConfiguration = ClientConfiguration.builder()
                .connectedTo("localhost:9200")
                .build();

        return RestClients.create(clientConfiguration).rest();
    }
}

问题1: elasticsearch在配置文件中写了连接配置还需要写elasticsearch配置类吗

在Spring Boot应用程序中,通常你不需要显式编写一个独立的Elasticsearch配置类,因为Spring Boot已经提供了自动配置来处理Elasticsearch连接。当你在application.propertiesapplication.yml中提供了Elasticsearch连接信息时,Spring Boot会根据这些属性自动配置Elasticsearch连接。

问题2:spring.data.elasticsearch.repositories.enabled是什么属性?

spring.data.elasticsearch.repositories.enabled 是一个Spring Boot属性,用于控制是否启用Spring Data Elasticsearch存储库(Repositories)。默认情况下,Spring Boot会自动检测你的项目中是否存在继承ElasticsearchRepository的接口,如果存在,则自动配置并启用Spring Data Elasticsearch存储库。

4.2. 在yml文件中添加配置属性

由上述两个问题可以得知,只需要配置spring.elasticsearch.uris属性,即可。

因为默认情况下,Spring Boot会自动检测你的项目中是否存在继承ElasticsearchRepository的接口,如果存在,则自动配置并启用Spring Data Elasticsearch存储库

相关推荐
一只爱打拳的程序猿17 分钟前
【Spring】更加简单的将对象存入Spring中并使用
java·后端·spring
晨欣19 分钟前
Elasticsearch和Lucene之间是什么关系?(ChatGPT回答)
elasticsearch·chatgpt·lucene
ajsbxi4 小时前
苍穹外卖学习记录
java·笔记·后端·学习·nginx·spring·servlet
鹿屿二向箔4 小时前
基于SSM(Spring + Spring MVC + MyBatis)框架的咖啡馆管理系统
spring·mvc·mybatis
NoneCoder5 小时前
Java企业级开发系列(1)
java·开发语言·spring·团队开发·开发
筱源源6 小时前
Elasticsearch-linux环境部署
linux·elasticsearch
paopaokaka_luck11 小时前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计
Yaml413 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
aloha_78913 小时前
从零记录搭建一个干净的mybatis环境
java·笔记·spring·spring cloud·maven·mybatis·springboot
wyh要好好学习16 小时前
SpringMVC快速上手
java·spring