springboot web项目调用elasticsearch API 进行索引、文档操作
pom.xml新增文件
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>4.9</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.2.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>7.2.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.2.0</version>
</dependency>
Controller层 接收异常并进行处理
@Slf4j
@Controller
@RequestMapping(value = "/water-api")
@CrossOrigin(origins = "*", maxAge = 3600, allowCredentials = "true", allowedHeaders = "*")
public class ElasticsearchController {
@Resource
private RestHighLevelClient restHighLevelClient;
@Resource
private ElasticsearchUtil elasticsearchUtil;
/**
* 备注 CreateIndexRequest创建索引 GetIndexRequest获取索引 deleteIndexRequest删除索引
* 查询索引是否存在
*
* @param indexName
* @return
*/
@ResponseBody
@RequestMapping(value = "/index/exists", method = RequestMethod.POST)
public Result indexExists(@RequestBody String indexName) {
boolean exists = elasticsearchUtil.isIndexExists(indexName);
return Result.ok(exists);
}
/**
* 删除索引
*
* @param map
* @return
*/
@ResponseBody
@RequestMapping(value = "/delete/exists", method = RequestMethod.POST)
public Result deleteIndex(@RequestBody HashMap<String, Object> map) {
boolean isDelete = elasticsearchUtil.deleteIndex((String) map.get("indexName"));
if (isDelete) {
return Result.ok("删除成功");
} else {
return Result.ok("删除失败");
}
}
/**
* 测试创建索引
*
* @param map
* @return
*/
@ResponseBody
@RequestMapping(value = "/create/exists", method = RequestMethod.POST)
public Result createIndex(@RequestBody HashMap<String, Object> map) {
String indexName = String.valueOf(map.get("indexName"));
try {
XContentBuilder builder = XContentFactory.jsonBuilder()
.startObject()
.field("properties")
.startObject()
.field("name").startObject().field("index", "true").field("type", "keyword").endObject()
.field("age").startObject().field("index", "true").field("type", "integer").endObject()
.field("money").startObject().field("index", "true").field("type", "double").endObject()
.field("address").startObject().field("index", "true").field("type", "text").endObject()
// .field("address").startObject().field("index", "true").field("type", "text").field("analyzer", "ik_max_word").endObject()
.field("birthday").startObject().field("index", "true").field("type", "date").field("format", "strict_date_optional_time||epoch_millis").endObject()
.endObject()
.endObject();
//创建索引的请求
CreateIndexRequest createIndexRequest = new CreateIndexRequest(indexName);
createIndexRequest.mapping(builder);
//客户端执行请求IndicesClient ,请求后获取响应
CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(createIndexRequest, RequestOptions.DEFAULT);
// IndexRequest indexRequest = new IndexRequest(indexName);
// indexRequest.source(builder);
// IndexResponse index = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
boolean acknowledged = createIndexResponse.isAcknowledged();
if (acknowledged) {
return Result.ok("创建成功");
}
} catch (IOException e) {
log.error("创建失败:{}", e.getCause());
}
return Result.error("创建失败");
}
/**
* 测试获取索引
*
* @param map
* @return
*/
@ResponseBody
@RequestMapping(value = "/get/index", method = RequestMethod.POST)
public Result getIndex(@RequestBody HashMap<String, Object> map) {
GetIndexRequest getIndexRequest = new GetIndexRequest((String) map.get("indexName"));
try {
boolean exists = restHighLevelClient.indices().exists(getIndexRequest, RequestOptions.DEFAULT);
if (exists) {
GetIndexResponse getIndexResponse = restHighLevelClient.indices().get(getIndexRequest, RequestOptions.DEFAULT);
return Result.ok("获取索引成功");
} else {
return Result.ok("索引不存在");
}
} catch (IOException e) {
log.error("/get/index:{}", e.getStackTrace());
return Result.ok("获取索引失败");
}
}
public Result testIndexforJson(String indexName) throws IOException {
IndexRequest indexRequest = new IndexRequest(indexName);
String jsonString = "{" +
"\"user\":\"niujun\"," +
"\"postDate\":\"2019-06-10\"," +
"\"message\":\"trying out Elasticsearch\"" +
"}";
//文档源以字符串形式提供
indexRequest.source(jsonString, XContentType.JSON);
IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
log.info("id:{}", indexResponse.getId());
return Result.ok("插入成功");
}
public Result testIndexforMap(String indexName) throws IOException {
Map<String, Object> jsonMap = new HashMap<>();
jsonMap.put("user", "kimchy");
jsonMap.put("postDate", new Date());
jsonMap.put("message", "trying out Elasticsearch");
IndexRequest indexRequest = new IndexRequest(indexName);
//文档源以字符串形式提供
indexRequest.source(jsonMap);
IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
log.info("id:{}", indexResponse.getId());
return Result.ok("插入成功");
}
/**
* 文档创建
*
* @param map
* @return
*/
@ResponseBody
@RequestMapping(value = "/add/document", method = RequestMethod.POST)
public Result addDocument(@RequestBody HashMap<String, Object> map) throws IOException {
//创建请求
IndexRequest indexRequest = new IndexRequest((String) map.get("indexName"));
//规则 put /indexName/_doc/1
indexRequest.timeout(TimeValue.timeValueSeconds(1));
ClientExceptionDto dto = new ClientExceptionDto();
dto.setName("niujun");
dto.setAge(33);
//将数据放入请求中
indexRequest.source(JSONObject.toJSONString(dto), XContentType.JSON);
//客户端发送请求,获取
IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
return Result.ok(indexResponse);
}
/**
* 获取文档
* web_water_2021.06.30/_doc/GhmeW3oBYRN5B60OiWub
* @param map
* @return
*/
@ResponseBody
@RequestMapping(value = "/get/document", method = RequestMethod.POST)
public Result getDocument(@RequestBody HashMap<String, Object> map) throws IOException {
String indexName = String.valueOf(map.get("indexName"));
String docId = String.valueOf(map.get("docId"));
//判断文档是否存在
GetRequest getRequest = new GetRequest(indexName, docId);
boolean exists = restHighLevelClient.exists(getRequest, RequestOptions.DEFAULT);
if (exists) {
GetResponse getResponse = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);
return Result.ok(getResponse);
} else {
return Result.ok("文档不存在");
}
}
/**
* 更新文档
*
* @param map
* @return
*/
@ResponseBody
@RequestMapping(value = "/update/document", method = RequestMethod.POST)
public Result updateDocument(@RequestBody HashMap<String, Object> map) throws IOException {
String indexName = String.valueOf(map.get("indexName"));
String docId = String.valueOf(map.get("docId"));
UpdateRequest updateRequest = new UpdateRequest(indexName, docId);
updateRequest.timeout(TimeValue.timeValueSeconds(1));
ClientExceptionDto dto = new ClientExceptionDto();
dto.setName("niujun1");
dto.setAge(331);
updateRequest.doc(JSONObject.toJSONString(dto), XContentType.JSON);
UpdateResponse updateResponse = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
return Result.ok(updateResponse);
}
/**
* 删除文档
*
* @param map
* @return
*/
@ResponseBody
@RequestMapping(value = "/delete/document", method = RequestMethod.POST)
public Result deleteDocument(@RequestBody HashMap<String, Object> map) throws IOException {
String indexName = String.valueOf(map.get("indexName"));
String docId = String.valueOf(map.get("docId"));
DeleteRequest deleteRequest = new DeleteRequest(indexName, docId);
deleteRequest.timeout(TimeValue.timeValueSeconds(1));
DeleteResponse deleteResponse = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
return Result.ok(deleteResponse);
}
/**
* 特殊 ,真实项目一般都是批量插入数据
*
* @param map
* @return
*/
@ResponseBody
@RequestMapping(value = "/bulkRequest/document", method = RequestMethod.POST)
public Result bulkRequest(@RequestBody HashMap<String, Object> map) throws IOException {
String indexName = String.valueOf(map.get("indexName"));
String docId = String.valueOf(map.get("docId"));
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.timeout(TimeValue.timeValueSeconds(1));
List<ClientExceptionDto> list = Lists.newArrayListWithExpectedSize(8);
for (int i = 0; i < list.size(); i++) {
bulkRequest.add(new IndexRequest(indexName).source(JSONObject.toJSONString(list.get(0)), XContentType.JSON));
}
BulkResponse bulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
return Result.ok(bulkResponse);
}
}
EsConfiguration Java文件
@Configuration
public class EsConfiguration {
private static String hosts = "192.168.60.233"; // 集群地址,多个用,隔开
private static int port = 9200; // 使用的端口号
private static String schema = "http"; // 使用的协议
private static ArrayList<HttpHost> hostList = null;
private static int connectTimeOut = 1000; // 连接超时时间
private static int socketTimeOut = 30000; // 连接超时时间
private static int connectionRequestTimeOut = 500; // 获取连接的超时时间
private static int maxConnectNum = 100; // 最大连接数
private static int maxConnectPerRoute = 100; // 最大路由连接数
static {
hostList = new ArrayList<>();
String[] hostStrs = hosts.split(",");
for (String host : hostStrs) {
hostList.add(new HttpHost(host, port, schema));
}
}
@Bean
public RestHighLevelClient client() {
RestClientBuilder builder = RestClient.builder(hostList.toArray(new HttpHost[0]));
// 异步httpclient连接延时配置
builder.setRequestConfigCallback(new RequestConfigCallback() {
@Override
public Builder customizeRequestConfig(Builder requestConfigBuilder) {
requestConfigBuilder.setConnectTimeout(connectTimeOut);
requestConfigBuilder.setSocketTimeout(socketTimeOut);
requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimeOut);
return requestConfigBuilder;
}
});
// 异步httpclient连接数配置
builder.setHttpClientConfigCallback(new HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
httpClientBuilder.setMaxConnTotal(maxConnectNum);
httpClientBuilder.setMaxConnPerRoute(maxConnectPerRoute);
return httpClientBuilder;
}
});
RestHighLevelClient client = new RestHighLevelClient(builder);
return client;
}
}
ElasticsearchUtil Java文件
@Component
public class ElasticsearchUtil {
@Resource
private RestHighLevelClient restHighLevelClient;
/**
* 判断索引是否存在
*
* @param indexName
* @return
*/
public boolean isIndexExists(String indexName) {
boolean exists = false;
GetIndexRequest getIndexRequest = new GetIndexRequest(indexName);
getIndexRequest.humanReadable(true);
try {
exists = restHighLevelClient.indices().exists(getIndexRequest, RequestOptions.DEFAULT);
} catch (IOException e) {
e.printStackTrace();
}
return exists;
}
public boolean deleteIndex(String indexName) {
boolean acknowledged = false;
try {
DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest(indexName);
deleteIndexRequest.indicesOptions(IndicesOptions.LENIENT_EXPAND_OPEN);
AcknowledgedResponse delete = restHighLevelClient.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
acknowledged = delete.isAcknowledged();
} catch (IOException e) {
e.printStackTrace();
}
return acknowledged;
}
}