1.导入依赖,在yml中写下es配置
(1) 在项目pom中导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
(2) 在application.yml配置文件中配置ES所需参数
elasticSearch:
host: 111.504.189.94:9200
注:
1.spring-boot-dependencies.pom里本身自带了elasticsearch,这里引用即可
2.yml中配置参数名称,纯属自定义,无特殊含义
2.创建配置类[这里仅做最简单配置,连接上单机ES]
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.elasticsearch.client.ClientConfiguration;
import org.springframework.data.elasticsearch.client.RestClients;
@Configuration
public class RestClientConfig {
@Value("${elasticSearch.host}")
private String esIp;
@Bean
public RestHighLevelClient elasticsearchClient() {
ClientConfiguration clientConfiguration = ClientConfiguration.builder()
.connectedTo(esIp)
.build();
return RestClients.create(clientConfiguration).rest();
}
}
3.附上一个简化版工具类,复杂的可以自己写或者搜索下找找
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.MatchAllQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.cglib.beans.BeanMap;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* ES自废弃type之后, index 类似 表, document 类似 行, id 类似 行主键
* */
@Component
public class EsUtils {
@Resource
private RestHighLevelClient restHighLevelClient;
// 添加单个 | 指定index,添加一行数据(仅限单个实体类,Map对象)
public int addIndexDocument(String index,Object data){
int status = 0;
try {
IndexRequest indexRequest = new IndexRequest().index(index);
if (!(data instanceof Map)) {
BeanMap beanMap = BeanMap.create(data);
indexRequest.source(beanMap);
}else{
indexRequest.source((Map) data);
}
IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
status = indexResponse.status().getStatus();
} catch (IOException e) {
e.printStackTrace();
}
return status;
}
// 删除单个 | 指定index,及index中对应主键 _id值, 删除一条数据
public int deleteDocumentById(String index,String _id) {
//参数1: 索引 参数2:类型 参数3:删除id
int status = 0;
try {
DeleteRequest deleteRequest = new DeleteRequest().index(index).id(_id);
DeleteResponse deleteResponse = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
status = deleteResponse.status().getStatus();
} catch (IOException e) {
e.printStackTrace();
}
return status;
}
// 更新单个 | 指定index,及index中对应主键 _id值, 修改一条数据
public int updateDocumentById(String index,String _id,Object data) {
int status = 0;
try {
UpdateRequest updateRequest = new UpdateRequest().index(index).id(_id);
if (!(data instanceof Map)) {
BeanMap beanMap = BeanMap.create(data);
updateRequest.doc(beanMap);
}else{
updateRequest.doc((Map) data);
}
UpdateResponse updateResponse = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
status = updateResponse.status().getStatus();
} catch (IOException e) { // 如果_id不存在,会抛出异常
return status;
}
return status;
}
// 批量添加 | 注: bulkRequest.add(),可以加入多种操作一起, bulkRequest.add(添加),bulkRequest.add(修改),bulkRequest.add(删除) 都可以一起
public int multiUpdateDocument(String index,List<Object> data) {
int status = 0;
try {
BulkRequest bulkRequest = new BulkRequest();
for (int i = 0; i < data.size(); i++) {
IndexRequest indexRequest = new IndexRequest().index(index);
if (!(data.get(i) instanceof Map)) {
BeanMap beanMap = BeanMap.create(data.get(i));
indexRequest.source(beanMap);
} else {
indexRequest.source((Map)data.get(i));
}
bulkRequest.add(indexRequest);
}
BulkResponse bulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
status = bulkResponse.status().getStatus();
} catch (IOException e) {
e.printStackTrace();
return status;
}
return status;
}
/**
* 普通条件查询
* index: 索引
* mQuery:查询条件
* filter: 过滤条件
* sortFiled: 排序字段
* order: 排序顺序[DESC/ASC]
* from: 起始条数
* size: 每页展示记录
* */
public List<Map<String, Object>> querySearch(String index, MatchAllQueryBuilder mQuery,MatchAllQueryBuilder filter,String sortFiled,SortOrder order,int from,int size) throws IOException {
// 最终结果返回 - 可自定义
List<Map<String, Object>> maps = new ArrayList<>();
SearchRequest searchRequest = new SearchRequest(index); // 创建搜索对象
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); // 搜索构建对象[条件限制]
if (mQuery != null) searchSourceBuilder.query(mQuery);//执行查询条件
if (filter != null) searchSourceBuilder.postFilter(filter); //过滤条件
searchSourceBuilder.from(from)//起始条数
.size(size)//每页展示记录
.sort(sortFiled, order)//排序
.highlighter(new HighlightBuilder().field("*").requireFieldMatch(false));//高亮
searchRequest.source(searchSourceBuilder); // 创建搜索请求
// 开始搜索
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
System.out.println("结果总数: " + searchResponse.getHits().getTotalHits());
// 结果集合
SearchHit[] hits = searchResponse.getHits().getHits();
for (SearchHit hit : hits) {
Map<String, Object> sourceAsMap = hit.getSourceAsMap(); // 结果集以Map接收
maps.add(sourceAsMap);
}
return maps;
}
}