提供一个基于ElasticsearchRestTemplate查询的ES查询工具类 java
时间: 2023-08-13 09:14:08 浏览: 57
可以参考以下代码实现一个基于ElasticsearchRestTemplate的查询工具类:
```java
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchResultMapper;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.List;
@Component
public class ElasticsearchQueryUtils {
private final ElasticsearchRestTemplate elasticsearchRestTemplate;
@Autowired
public ElasticsearchQueryUtils(ElasticsearchRestTemplate elasticsearchRestTemplate) {
this.elasticsearchRestTemplate = elasticsearchRestTemplate;
}
public <T> List<T> query(QueryBuilder queryBuilder, Class<T> clazz) throws IOException {
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(queryBuilder);
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
nativeSearchQueryBuilder.withSourceFilter(searchSourceBuilder.fetchSource());
nativeSearchQueryBuilder.withQuery(queryBuilder);
SearchResultMapper searchResultMapper = elasticsearchRestTemplate.getResultsMapper();
SearchResponse searchResponse = elasticsearchRestTemplate.query(nativeSearchQueryBuilder.build(), response -> response, RequestOptions.DEFAULT);
return searchResultMapper.mapResults(searchResponse, clazz);
}
}
```
这个工具类提供了一个`query`方法,根据查询条件QueryBuilder执行查询,返回符合条件的对象列表。
其中,`query`方法使用了`SearchResultMapper`将查询结果映射为对象列表,因此需要在项目中定义一个`SearchResultMapper`的实现类。这个实现类需要实现`mapResults`方法,将ES的查询结果映射为指定类型的对象列表,例如:
```java
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.search.SearchHit;
import org.springframework.data.elasticsearch.core.SearchResultMapper;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Component
public class MySearchResultMapper implements SearchResultMapper {
@Override
public <T> List<T> mapResults(SearchResponse response, Class<T> clazz, SearchHitMapper mapper) {
List<T> list = new ArrayList<>();
for (SearchHit hit : response.getHits()) {
Map<String, Object> source = hit.getSourceAsMap();
T obj = mapper.mapToObject(source, clazz);
list.add(obj);
}
return list;
}
}
```
这个`MySearchResultMapper`类将ES的查询结果映射为指定类型的对象列表。这里使用了一个`SearchHitMapper`接口,用于将ES的查询结果转换为对象,例如:
```java
public interface SearchHitMapper {
/**
* 将ES的查询结果转换为对象
*
* @param source 查询结果
* @param clazz 对象类型
* @param <T> 对象泛型
* @return 对象
*/
<T> T mapToObject(Map<String, Object> source, Class<T> clazz);
}
```
这个接口的实现类可以根据具体的业务需求来实现。