文章目录
概要
SpringBoot3中的elasticsearch版本已经来到8.x版本,相比较于SpringBoot2中的7.x版本相关写法已经发生改变。在SpringBoot2中会使用ElasticsearchRestTemplate和es进行交互,但这个类在SpringBoot3中已经被移除,需要使用ElasticsearchTemplate或者ElasticsearchClient和es进行交互。下面介绍这两个类的基本使用方式。
ElasticsearchTemplate
java
@Test
void test_1() {
NativeQuery query = new NativeQueryBuilder()
.withPageable(Pageable.ofSize(100))
//使用lambda表达式使其更符合es语句的写法
.withQuery(q -> q
.bool(b -> b
.filter(f -> f
.term(t -> t
.field("Name")
.value("test")))))
.withSort(s -> s
.field(f -> f
.field("Name")
.order(SortOrder.Desc)))
.build();
SearchHits<User> search = elasticsearchTemplate.search(query, User.class, IndexCoordinates.of("test-topic"));
List<SearchHit<User>> searchHits = search.getSearchHits();
for (SearchHit<User> searchHit : searchHits) {
System.out.println(searchHit.getContent().getName());
}
}
以上的es查询语句等价于
json
{
"query": {
"bool": {
"filter": [
{
"term": {
"Name": {
"value": "test"
}
}
}
]
}
},
"from": 0,
"size": 100,
"sort": [
{
"Name": {
"order": "desc"
}
}
]
}
ElasticsearchClient
java
@Test
void test_2() throws IOException {
Function<SearchRequest.Builder, ObjectBuilder<SearchRequest>> query = fn-> fn
.index("test-topic")
.size(100)
//使用lambda表达式使其更符合es语句的写法
.query(q -> q
.bool(b -> b
.filter(f -> f
.term(t -> t
.field("Name")
.value("test")))))
.sort(s -> s
.field(f -> f
.field("Name")
.order(SortOrder.Desc)));
SearchResponse<User> search = elasticsearchClient.search(query, User.class);
List<Hit<User>> hits = search.hits().hits();
for (Hit<User> hit : hits) {
System.out.println(hit.source().getName());
}
}
小结
1.依赖引入
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
2.ElasticsearchTemplate和ElasticsearchClient已经自动装配,业务类中直接注入即可。
3.User类
java
/**
* test_1:使用第一种测试时,实体属性和es字段属性不对应时需要使用@Field(org.springframework.data.elasticsearch.annotations.Field)注解标识
* test_2:使用第二种测试时,实体属性和es字段属性不对应时需要使用@JsonProperty(com.fasterxml.jackson.annotation.JsonProperty)注解标识
*/
@Data
public class User {
@Id
private String id;
@Field("Name")
@JsonProperty("Name")
private String name;
}