ElasticSearch Springboot集成
配置
application.yml
spring:
application:
name: elastic_search
elasticsearch:
address: 192.168.127.130:9200
ESConfig
package com.work.esapi.config;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpHost;
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.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Arrays;
import java.util.Objects;
/**
* es RestHighLevelClient 配置
* es 7.x之后 只支持http
* @author qjc
* @date 2019-07-19 10:33
*/
@Configuration
@Slf4j
public class ESConfig {
private static final int ADDRESS_LENGTH = 2;
private static final String HTTP_SCHEME = "http";
//权限验证
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
/**
* 使用冒号隔开ip和端口
*/
@Value("${elasticsearch.address}")
private String[] address;
// @Value("${elasticsearch.username}")
// private String username;
// @Value("${elasticsearch.password}")
// private String password;
@Bean
public RestClientBuilder restClientBuilder() {
HttpHost[] hosts = Arrays.stream(address)
.map(this::makeHttpHost)
.filter(Objects::nonNull)
.toArray(HttpHost[]::new);
log.debug("hosts:{}", Arrays.toString(hosts));
//配置权限验证
// credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));
RestClientBuilder restClientBuilder = RestClient.builder(hosts).setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
});
return restClientBuilder;
}
@Bean(name = "highLevelClient")
public RestHighLevelClient highLevelClient(@Autowired RestClientBuilder restClientBuilder) {
// restClientBuilder.setMaxRetryTimeoutMillis(60000);
return new RestHighLevelClient(restClientBuilder);
}
/**
* 处理请求地址
* @param s
* @return HttpHost
*/
private HttpHost makeHttpHost(String s) {
String[] address = s.split(":");
if (address.length == ADDRESS_LENGTH) {
String ip = address[0];
int port = Integer.parseInt(address[1]);
return new HttpHost(ip, port, HTTP_SCHEME);
} else {
return null;
}
}
}
entity User
/**
*
*/
package com.work.esapi.entity;
import lombok.*;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
/**
* 访问日志
*/
@Document(indexName = "user")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
@Field(type= FieldType.Text)
private String name;
private int age;
}
具体api测试
package com.work.esapi;
import com.alibaba.fastjson.JSON;
import com.work.esapi.entity.User;
import org.apache.lucene.index.IndexReader;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexAction;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
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.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
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.support.master.AcknowledgedResponse;
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.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.TermQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
@SpringBootTest
class EsApiApplicationTests {
@Autowired
private RestHighLevelClient highLevelClient;
@Test
void contextLoads() {
}
// 创建索引
@Test
void createIndex() throws IOException {
CreateIndexRequest createIndexRequest = new CreateIndexRequest("estest");
CreateIndexResponse createIndexResponse = highLevelClient.indices().create(createIndexRequest, RequestOptions.DEFAULT);
System.out.println(createIndexResponse.toString());
}
//判断索引是否存在
@Test
void existIndex() throws Exception{
GetIndexRequest getIndexRequest = new GetIndexRequest("estest");
boolean exist = highLevelClient.indices().exists(getIndexRequest,RequestOptions.DEFAULT);
System.out.println(exist);
}
//删除索引
@Test
void deleteIndex() throws Exception{
DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("estest");
AcknowledgedResponse delete = highLevelClient.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
System.out.println(delete.isAcknowledged());
}
/*************文档操作***************/
// 添加文档(行) put /zgc_index/_doc/1 {xxx}
@Test
void addDocument() throws Exception{
User user = new User("李四",15);
String string = JSON.toJSONString(user);
IndexRequest indexRequest = new IndexRequest("estest");
indexRequest.source(string, XContentType.JSON);
indexRequest.timeout(TimeValue.timeValueSeconds(1));
// indexRequest.id("1");
IndexResponse indexResponse = highLevelClient.index(indexRequest,RequestOptions.DEFAULT);
System.out.println(indexResponse.toString());
System.out.println(indexResponse.status());
}
// 判断文档是否存在(和判断索引差不多)
@Test
void existDocument() throws Exception {
GetRequest getRequest = new GetRequest("estest","2");
boolean exists = highLevelClient.exists(getRequest, RequestOptions.DEFAULT);
System.out.println(exists);
}
// 获取文档
@Test
void getDocument() throws Exception{
GetRequest getRequest = new GetRequest("estest","cYbQzHcBcsvsRIxxF5_d");
GetResponse documentFields = highLevelClient.get(getRequest, RequestOptions.DEFAULT);
System.out.println(documentFields);
System.out.println(documentFields.getSourceAsString());
}
//更新文档
@Test
void updateDocument() throws Exception{
UpdateRequest updateRequest = new UpdateRequest("estest","1");
User user = new User("张三三",10);
updateRequest.doc(JSON.toJSONString(user),XContentType.JSON);
updateRequest.timeout("1s");
UpdateResponse update = highLevelClient.update(updateRequest, RequestOptions.DEFAULT);
System.out.println(update);
System.out.println(update.status());
}
// 删除文档
@Test
void delDocument() throws IOException {
DeleteRequest deleteRequest = new DeleteRequest("zgc_index","2");
deleteRequest.timeout("1s");
DeleteResponse delete = highLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
System.out.println(delete);
System.out.println(delete.status());
}
// 批量插入
@Test
void bulkDocument() throws Exception{
List<User> userList = new ArrayList<>();
userList.add(new User("影流之主",100));
userList.add(new User("阿卡丽",80));
userList.add(new User("潘森",200));
userList.add(new User("蔡嵩颂",30));
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.timeout("10s");
for (int i = 0; i < userList.size(); i++) {
bulkRequest.add(new IndexRequest("estest").source(JSON.toJSONString(userList.get(i)),XContentType.JSON));
}
BulkResponse bulk = highLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
System.out.println(bulk);
System.out.println(bulk.hasFailures());//false代表成功
}
//查询
@Test
void search() throws Exception{
//查询请求
SearchRequest searchRequest = new SearchRequest("estest");
//查询构造
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//查询条件1和2
// TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name","aa");
QueryBuilder termQueryBuilder = new TermQueryBuilder("name","阿");
// searchSourceBuilder.highlighter();
searchSourceBuilder.query(termQueryBuilder);
searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
searchRequest.source(searchSourceBuilder);
SearchResponse search = highLevelClient.search(searchRequest, RequestOptions.DEFAULT);
System.out.println(search);
System.out.println(JSON.toJSONString(search.getHits()));
System.out.println("--------------------------");
for (SearchHit hit : search.getHits()){
System.out.println(hit.getSourceAsMap());
}
System.out.println("--------------------------");
for (SearchHit hit : search.getHits().getHits()){
System.out.println(hit.getSourceAsMap());
}
}
}
完成!