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 |
4. 配置
4.1. 使用配置类
@Configuration
@EnableElasticsearchRepositories(basePackages = "org.springframework.data.elasticsearch.repository")
public class ElasticsearchConfiguration extends AbstractElasticsearchConfiguration {@Override@Beanpublic 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存储库