之前项目中使用的是 spring-boot-starter-data-elasticsearch,现在要迁移到阿里云elasticsearch,本篇主要记录我封装的工具类及demo,当然前提是要购买了阿里云Elasticsearch服务,挺贵的。
必要参考的两个文档:
1.阿里云Elasticsearch文档(比较粗糙)
https://help.aliyun.com/document_detail/57770.html?spm=a2c4g.11186623.6.542.66e63eb7ka2vhN
2.Elasticsearch官方API(建议使用谷歌浏览器翻译)
https://www.elastic.co/guide/en/elasticsearch/client/java-rest/6.3/java-rest-high-search.html
官方API上gradle、maven依赖都有,版本号与阿里云买的一致
buildscript {
repositories {
maven { url 'http://s3.amazonaws.com/download.elasticsearch.org/lucenesnapshots/00142c9' }
}
}
dependencies {
compile 'org.elasticsearch.client:elasticsearch-rest-high-level-client:6.3.2'
compile 'org.elasticsearch:elasticsearch:6.3.2'
}
1.RestHighLevelClient初始化连接类
package com.example.demo1.controller;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class ElasticRestClientFactory {
private static String username;
private static String password;
private static String hostname;
private static int port;
@Value("${aliyun.elastic.username}")
public void setUsername(String username) {
ElasticRestClientFactory.username = username;
}
@Value("${aliyun.elastic.password}")
public void setPassword(String password) {
ElasticRestClientFactory.password = password;
}
@Value("${aliyun.elastic.hostname}")
public void setHostname(String hostname) {
ElasticRestClientFactory.hostname = hostname;
}
@Value("${aliyun.elastic.port}")
public void setPort(int port) {
ElasticRestClientFactory.port = port;
}
private static RestHighLevelClient restHighClient;
/**
* 建立连接
*/
private static void init() {
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY,
new UsernamePasswordCredentials(username, password));
restHighClient = new RestHighLevelClient(
RestClient.builder(new HttpHost(hostname, port))
.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
})
);
}
public static RestHighLevelClient getRestHighClient() {
init();
return restHighClient;
}
}
2.RestHighLevelClient增、查、删工具类
package com.example.demo1.controller;
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.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class ElasticRestClientSevice {
/**
* 存json
*
* @param index
* @param type
* @param id
* @param json
*/
public void saveByJson(String index, String type, String id, String json) {
try {
RestHighLevelClient restHighClient = ElasticRestClientFactory.getRestHighClient();
IndexRequest request = new IndexRequest(index, type, id)
.source(json, XContentType.JSON);
IndexResponse indexResponse = restHighClient.index(request);
restHighClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 存map
*
* @param index
* @param type
* @param id
* @param map
*/
public void saveByMap(String index, String type, String id, Map<String, Object> map) {
try {
RestHighLevelClient restHighClient = ElasticRestClientFactory.getRestHighClient();
IndexRequest request = new IndexRequest(index, type, id)
.source(map);
IndexResponse indexResponse = restHighClient.index(request);
restHighClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 按条件搜索
*
* @param index
* @param type
* @param queryBuilder
* @param start
* @param size
* @return
*/
public Map<String, Object> searchByQuery(String index, String type, int start, int size, QueryBuilder queryBuilder) {
try {
RestHighLevelClient restHighClient = ElasticRestClientFactory.getRestHighClient();
Map<String, Object> resultMap = new HashMap<>();
//搜索请求
SearchRequest searchRequest = new SearchRequest(
index);
searchRequest.types(type);
//控制搜索行为
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
if (queryBuilder != null) {
searchSourceBuilder.query(queryBuilder);
}
if (start != 0 && size != 0) {
searchSourceBuilder.from(start);
searchSourceBuilder.size(size);
}
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = restHighClient.search(searchRequest);
//搜索返回文档
SearchHits hits = searchResponse.getHits();
long total = hits.getTotalHits();
resultMap.put("total", total);
List<Map<String, Object>> mapList = new ArrayList<>();
SearchHit[] searchHits = hits.getHits();
for (SearchHit hit : searchHits) {
// 查询的结果 Map的形式
Map<String, Object> sourceAsMap = hit.getSourceAsMap();
mapList.add(sourceAsMap);
}
resultMap.put("list", mapList);
restHighClient.close();
return resultMap;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
/**
* 根据id删除
*
* @param index
* @param type
* @param id
*/
public void deleteById(String index, String type, String id) {
try {
RestHighLevelClient restHighClient = ElasticRestClientFactory.getRestHighClient();
DeleteRequest request = new DeleteRequest(index, type, id);
DeleteResponse deleteResponse = restHighClient.delete(request);
restHighClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.测试controller接口
package com.example.demo1.controller;
import com.alibaba.fastjson.JSON;
import com.example.demo1.domain.ElasticPojo;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/es")
public class EsClientController {
@Autowired
private ElasticRestClientSevice esClient;
/**
* 插入文档
*/
@RequestMapping("/save")
public void saveUser() {
ElasticPojo elasticPojo = new ElasticPojo();
elasticPojo.setUser("kimchy");
elasticPojo.setMessage("aaaaaaaaaaa");
elasticPojo.setSex(2);
String jsonString1 = JSON.toJSONString(elasticPojo);
// 存对象的json
esClient.saveByJson("my_index", "type_1", "5", jsonString1);
}
/**
* 查询文档
* @return
*/
@RequestMapping("/get")
public String getUser() {
try {
// 查询条件
QueryBuilder qb0 = QueryBuilders.termQuery("user", "kimchy");
QueryBuilder queryBuilder = QueryBuilders.boolQuery().must(qb0);
Map<String, Object> map = esClient.searchByQuery("my_index", "type_1", 0, 0, queryBuilder);
List<Map<String, Object>> list = (List<Map<String, Object>>) map.get("list");
return list.toString();
}catch (Exception e){
e.printStackTrace();
return null;
}
}
/**
* 删除文档
*/
@RequestMapping("/delete")
public void deleteUser() {
esClient.deleteById("my_index", "type_1", "4");
}
}
参考博文:
常用查询方法QueryBuilder构造举例API:
https://blog.csdn.net/u012546526/article/details/74184769
Map对象与JavaBean互转,List<Map>与List<JavaBean>互转:
https://blog.csdn.net/wyply115/article/details/50994477?utm_source=blogxgwz1