这里主要学习的是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
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.properties 或application.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存储库