使用
Maven依赖
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>4.3.9</version>
</dependency>
配置类
@Configuration
public class EsConfig extends AbstractElasticsearchConfiguration {
/**
* 装配RestHighLevelClient客户端
* @return
*/
@Override
public RestHighLevelClient elasticsearchClient() {
//初始化连接配置
ClientConfiguration conf =
ClientConfiguration.create("127.0.0.1:9200");
//创建客户端并返回
return RestClients.create(conf).rest();
}
/**
* 装配Elasticsearch的Template,用于操作ES
* @return
*/
@Bean
public ElasticsearchRestTemplate elasticsearchRestTemplate(RestHighLevelClient client) {
//创建Template并注入RestHighLevelClient
return new ElasticsearchRestTemplate(client);
}
}
EsService
@Service
@RequiredArgsConstructor
public class EsService {
private final ElasticsearchRestTemplate template;
/**
* 手动创建索引
* 根据Class类上的@Ducument注解指定的index来创建索引
*/
public void createIndex(Class<?> doType) {
// 判断索引是否创建,如果没有则通过
if (!template.indexOps(doType).exists()) {
template.indexOps(doType).create();
}
}
/**
* 删除索引
*
* @param doType
*/
public void deleteIndex(Class<?> doType) {
// 判断索引是否创建,如果有则通过
if (template.indexOps(doType).exists()) {
template.indexOps(doType).delete();
}
}
/**
* 判断索引是否创建,如果有则返回true
* @param doType
* @return
*/
public boolean existsIndex(Class<?> doType){
return template.indexOps(doType).exists();
}
/**
* 创建mapping
*/
public void createMapping(Class<?> doType) {
template.indexOps(doType).putMapping();
}
/**
* 创建文档
*
* @param doc
* @param <T>
*/
public <T> void createDoc(T doc) {
template.save(doc);
}
/**
* 判断文档是否存在
*
* @param id
* @param indexName
* @return
*/
public boolean docExists(String id, String indexName) {
return template.exists(id, IndexCoordinates.of(indexName));
}
/**
* 根据id查询具体的文档
*
* @param id
* @param docType
* @param <T>
* @return
*/
public <T> T getDocById(String id, Class<T> docType) {
return template.get(id, docType);
}
/**
* 更新文档
*
* @param document
*/
public void updateDoc(Document document) {
UpdateQuery query = UpdateQuery.builder(document.getId()).withDocument(document).build();
template.update(query, IndexCoordinates.of(document.getIndex()));
}
/**
* 根据id删除文档
*
* @param id
* @param docType
* @return
*/
public void deleteDoc(String id, Class<?> docType){
template.delete(id,docType);
}
/**
* 查询所有的文档记录
* @return
*/
public <T> List<T> listNames(Class<T> docType){
NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();
SearchHits<T> hits = template.search(builder.build(),docType);
List<T> list = new ArrayList<>();
hits.forEach(tSearchHit -> list.add(tSearchHit.getContent()));
return list;
}
/**
* 查询所有的文档记录
* @return
*/
public <T> List<T> listNames(Class<T> docType,Integer pageNum,Integer pageSize){
NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();
builder.withPageable(PageRequest.of(pageNum,pageSize));
SearchHits<T> hits = template.search(builder.build(),docType);
List<T> list = new ArrayList<>();
hits.forEach(tSearchHit -> list.add(tSearchHit.getContent()));
return list;
}
/**
* 根据条件查询文档记录
* @param searchParam 查询参数
* @param field 检索的字段
* @param docType 文档的Class对象
* @param pageNum 分页参数
* @param pageSize 分页参数
* @return
* @param <T>
*/
public <T> List<T> listNamesByName(String searchParam,String field,Class<T> docType,Integer pageNum,Integer pageSize){
NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();
builder.withPageable(PageRequest.of(pageNum,pageSize));
// term查询
builder.withQuery(QueryBuilders.termQuery(field,searchParam));
// match查询
// builder.withQuery(QueryBuilders.matchQuery(field,searchParam));
SearchHits<T> hits = template.search(builder.build(),docType);
List<T> list = new ArrayList<>();
hits.forEach(tSearchHit -> list.add(tSearchHit.getContent()));
return list;
}
/**
* 布隆查询
* @param docType
* @param searchParam
* @param fields
* @return
* @param <T>
*/
public <T> List<T> boolSearch(Class<T> docType,String searchParam,String... fields){
NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
for (String field:fields){
boolQueryBuilder.should(QueryBuilders.termQuery(field,searchParam));
}
builder.withQuery(boolQueryBuilder);
SearchHits<T> hits = template.search(builder.build(),docType);
List<T> list = new ArrayList<>();
hits.forEach(tSearchHit -> list.add(tSearchHit.getContent()));
return list;
}
/**
* 布隆查询
* @param docType
* @param searchParam
* @param fields
* @return
* @param <T>
*/
public <T> List<T> boolSearch(Class<T> docType,Integer pageNum,Integer pageSize,String searchParam,String... fields){
NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();
builder.withPageable(PageRequest.of(pageNum,pageSize));
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
for (String field:fields){
boolQueryBuilder.should(QueryBuilders.termQuery(field,searchParam));
}
builder.withQuery(boolQueryBuilder);
SearchHits<T> hits = template.search(builder.build(),docType);
List<T> list = new ArrayList<>();
hits.forEach(tSearchHit -> list.add(tSearchHit.getContent()));
return list;
}
}