最近有个需求,项目从之前的Spring-Data-Jest换成Spirng-Data-Elasticsearch,Client也换成了最新的7.16.2,这边query这边就需要微改一下。记录下
一开始想用Entity repository的方式,但是发现太麻烦了,需要建立过多的实体,而且query语句也需要大改,后面查看官方文档,看到了使用 org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate的查询方式。
pom
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
configuration
这边我是用的是jhipster生成的,所以直接贴出来默认的configuration
package com.damien.test.generated.config;
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Arrays;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.convert.ReadingConverter;
import org.springframework.data.convert.WritingConverter;
import org.springframework.data.elasticsearch.config.ElasticsearchConfigurationSupport;
import org.springframework.data.elasticsearch.core.convert.ElasticsearchCustomConversions;
@Configuration
public class ElasticsearchConfiguration extends ElasticsearchConfigurationSupport {
@Bean
@Override
public ElasticsearchCustomConversions elasticsearchCustomConversions() {
return new ElasticsearchCustomConversions(
Arrays.asList(
new ZonedDateTimeWritingConverter(),
new ZonedDateTimeReadingConverter(),
new InstantWritingConverter(),
new InstantReadingConverter(),
new LocalDateWritingConverter(),
new LocalDateReadingConverter()
)
);
}
@WritingConverter
static class ZonedDateTimeWritingConverter implements Converter<ZonedDateTime, String> {
@Override
public String convert(ZonedDateTime source) {
if (source == null) {
return null;
}
return source.toInstant().toString();
}
}
@ReadingConverter
static class ZonedDateTimeReadingConverter implements Converter<String, ZonedDateTime> {
@Override
public ZonedDateTime convert(String source) {
if (source == null) {
return null;
}
return Instant.parse(source).atZone(ZoneId.systemDefault());
}
}
@WritingConverter
static class InstantWritingConverter implements Converter<Instant, String> {
@Override
public String convert(Instant source) {
if (source == null) {
return null;
}
return source.toString();
}
}
@ReadingConverter
static class InstantReadingConverter implements Converter<String, Instant> {
@Override
public Instant convert(String source) {
if (source == null) {
return null;
}
return Instant.parse(source);
}
}
@WritingConverter
static class LocalDateWritingConverter implements Converter<LocalDate, String> {
@Override
public String convert(LocalDate source) {
if (source == null) {
return null;
}
return source.toString();
}
}
@ReadingConverter
static class LocalDateReadingConverter implements Converter<String, LocalDate> {
@Override
public LocalDate convert(String source) {
if (source == null) {
return null;
}
return LocalDate.parse(source);
}
}
}
yml
spring:
elasticsearch:
rest:
uris:http://localhost:9200
service
//import org.springframework.data.domain.Pageable;
//import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
//import org.springframework.data.elasticsearch.core.SearchHit;
//import org.springframework.data.elasticsearch.core.SearchHits;
//import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
//import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
//import org.springframework.data.elasticsearch.core.query.Query;
//import org.elasticsearch.index.query.TermQueryBuilder;
IndexCoordinates index = IndexCoordinates.of("some_index");
Query query = new NativeSearchQueryBuilder()
.withPageable(Pageable.unpaged())
.withFilter(new TermQueryBuilder("column.keyword", "xxxxx"))
.build();
SearchHits<HashMap> hit=template.search(query, HashMap.class, index);
for (SearchHit<HashMap> result : hit.getSearchHits()) {
String somePropertie=(String)result.getContent().get("somePropertie");
//.....
}
这样就可以构建NativeSearchQuery进行查询了。
当然你要使用repository的方式建立实体可以。
就类似于JPA的查询方式,建立实体,通过repository进行查询就可以了,就不多赘述了。