diff --git a/pom.xml b/pom.xml index 16cf573eb296d240a9964a992b24976b3617fc86..40db940dcd65596b5055499da5b16dc479f245f7 100644 --- a/pom.xml +++ b/pom.xml @@ -13,4 +13,41 @@ 8 + + + + org.elasticsearch.client + elasticsearch-rest-high-level-client + 7.3.0 + + + org.elasticsearch + elasticsearch + + + + + org.elasticsearch + elasticsearch + 7.3.0 + + + + org.springframework.boot + spring-boot-starter + 2.0.6.RELEASE + + + org.springframework.boot + spring-boot-starter-test + test + 2.0.6.RELEASE + + + org.projectlombok + lombok + 1.16.10 + + + \ No newline at end of file diff --git a/src/main/java/com/kwan/shuyu/SearchApplication.java b/src/main/java/com/kwan/shuyu/SearchApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..deed20fc0578a5e2e12b11abb23f842ff8789cc3 --- /dev/null +++ b/src/main/java/com/kwan/shuyu/SearchApplication.java @@ -0,0 +1,12 @@ +package com.kwan.shuyu; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + + +@SpringBootApplication +public class SearchApplication { + public static void main(String[] args) { + SpringApplication.run(SearchApplication.class,args); + } +} diff --git a/src/main/java/com/kwan/shuyu/config/ElasticsearchConfig.java b/src/main/java/com/kwan/shuyu/config/ElasticsearchConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..12c4bbd085a005b99f45c1bd549c71de0eca14cf --- /dev/null +++ b/src/main/java/com/kwan/shuyu/config/ElasticsearchConfig.java @@ -0,0 +1,33 @@ +package com.kwan.shuyu.config; + +import org.apache.http.HttpHost; +import org.elasticsearch.client.RestClient; +import org.elasticsearch.client.RestHighLevelClient; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * es的配置类 + * + * @author : qinyingjie + * @version : 2.2.0 + * @date : 2023/5/10 12:37 + */ +@Configuration +public class ElasticsearchConfig { + + @Value("${kwan.elasticsearch.hostlist}") + private String hostlist; + + @Bean(destroyMethod = "close") + public RestHighLevelClient restHighLevelClient() { + String[] split = hostlist.split(","); + HttpHost[] httpHostsArray = new HttpHost[split.length]; + for (int i = 0; i < split.length; i++) { + String item = split[i]; + httpHostsArray[i] = new HttpHost(item.split(":")[0], Integer.parseInt(item.split(":")[1]), "http"); + } + return new RestHighLevelClient(RestClient.builder(httpHostsArray)); + } +} \ No newline at end of file diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000000000000000000000000000000000000..f7312457a7e6fcad3b9a40634904e84039aa1779 --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,6 @@ +spring: + application: + name: search-service +kwan: + elasticsearch: + hostlist: 47.119.160.231:9200 #多个节点用逗号分隔 \ No newline at end of file diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml new file mode 100644 index 0000000000000000000000000000000000000000..bf5bcf4ba2920b298ccb4c7c45b6cb6f9344e90d --- /dev/null +++ b/src/main/resources/logback-spring.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + utf8 + + + + + + + + ${LOG_HOME}/xc.%d{yyyy-MM-dd}.log + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + 0 + + 512 + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/java/TestDemo.java b/src/test/java/TestDemo.java new file mode 100644 index 0000000000000000000000000000000000000000..ad9d2f8c49bf9d005a6219cba8c00d1a974aeda5 --- /dev/null +++ b/src/test/java/TestDemo.java @@ -0,0 +1,32 @@ +import org.apache.http.HttpHost; +import org.elasticsearch.action.get.GetRequest; +import org.elasticsearch.action.get.GetResponse; +import org.elasticsearch.client.RequestOptions; +import org.elasticsearch.client.RestClient; +import org.elasticsearch.client.RestHighLevelClient; + +import java.io.IOException; + +/** + * 普通项目查询es,获取数据 + * + * @author : qinyingjie + * @version : 2.2.0 + * @date : 2023/5/10 11:50 + */ +public class TestDemo { + public static void main(String[] args) throws IOException { + //1获取连接客户端 + RestHighLevelClient client = new RestHighLevelClient(RestClient.builder( + new HttpHost("47.119.160.231", 9200, "http") + )); + //2构建请求 + GetRequest getRequest = new GetRequest("book", "1"); + //3执行 + GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT); + //4获取结果 + System.out.println(getResponse.getId()); + System.out.println(getResponse.getVersion()); + System.out.println(getResponse.getSourceAsString()); + } +} \ No newline at end of file diff --git a/src/test/java/TestDocument.java b/src/test/java/TestDocument.java new file mode 100644 index 0000000000000000000000000000000000000000..297ee96841f5a746db201ec9823256978f53e626 --- /dev/null +++ b/src/test/java/TestDocument.java @@ -0,0 +1,272 @@ +import com.kwan.shuyu.SearchApplication; +import lombok.extern.slf4j.Slf4j; +import org.elasticsearch.action.DocWriteResponse; +import org.elasticsearch.action.bulk.BulkItemResponse; +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.support.replication.ReplicationResponse; +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.common.xcontent.XContentType; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + + +@Slf4j +@SpringBootTest(classes = SearchApplication.class) +@RunWith(SpringRunner.class) +public class TestDocument { + @Autowired + RestHighLevelClient client; + + @Test + public void testGet() throws IOException { +// 1构建请求 + GetRequest getRequest = new GetRequest("test_post", "1"); +// ===========可选参数========== +// String[] includes=new String[]{"user","message"}; +// String[] excludes= Strings.EMPTY_ARRAY; +// FetchSourceContext fetchSourceContext=new FetchSourceContext(true, includes, excludes); +// getRequest.fetchSourceContext(fetchSourceContext); +// String[] includes=Strings.EMPTY_ARRAY; +// String[] excludes= new String[]{"user","message"}; +// FetchSourceContext fetchSourceContext=new FetchSourceContext(true, includes, excludes); +// getRequest.fetchSourceContext(fetchSourceContext); +// getRequest.routing("routing"); +// 2执行 +// 同步查询 + GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT); + //异步查询 +// ActionListener listener=new ActionListener() { +// //成功时 +// public void onResponse(GetResponse getResponse) { +// System.out.println(getResponse.getId()); +//// System.out.println(getResponse.getVersion()); +//// System.out.println(getResponse.getSourceAsString()); +// } +// //失败时 +// public void onFailure(Exception e) { +// e.printStackTrace(); +// } +// }; +// +// client.getAsync(getRequest, RequestOptions.DEFAULT, listener); +// +// try { +// Thread.sleep(5000); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } +// 3获取结果 + if (getResponse.isExists()) { + System.out.println(getResponse.getId()); + System.out.println(getResponse.getVersion()); + System.out.println(getResponse.getSourceAsString());//以string获取数据 + System.out.println(getResponse.getSourceAsBytes());////以Bytes获取数据 + System.out.println(getResponse.getSourceAsMap());//以Map获取数据 + } else { + log.info("数据不存在"); + } + } + + @Test + public void testAdd() throws IOException { +// PUT test_post/_doc/2 +// { +// "user":"tomas", +// "postDate":"2019-07-18", +// "message":"trying out es1" +// } +// 1构建请求 + IndexRequest request = new IndexRequest("test_post"); + request.id("5"); +// ======================构建文档数据======================= + //方法1 + String jsonString = "{\n" + + " \"user\":\"tomas\",\n" + + " \"postDate\":\"2019-07-18\",\n" + + " \"message\":\"trying out es1\"\n" + + "}"; + request.source(jsonString, XContentType.JSON); + //方法2 +// Map jsonMap = new HashMap(); +// jsonMap.put("user", "tomas"); +// jsonMap.put("postDate", "2019-07-18"); +// jsonMap.put("message", "trying out es1"); +// request.source(jsonMap); + //方法3 +// XContentBuilder builder = XContentFactory.jsonBuilder(); +// builder.startObject(); +// { +// builder.field("user", "tomas"); +// builder.field("message", "trying out es1"); +// builder.timeField("postDate", "2019-07-18"); +// } +// builder.endObject(); +// request.source(builder); + //方法4 +// request.source("user", "tomas", +// "message", "trying out es1", +// "postDate", "2019-07-18"); +// =====可选参数== + //设置超时时间 +// request.timeout("1s"); +// request.timeout(TimeValue.timeValueSeconds(1)); + //手动维护版本号 +// request.version(4); +// request.versionType(VersionType.EXTERNAL); +// 2执行 + //同步 + IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT); +// 异步 +// ActionListener listener=new ActionListener() { +// //成功时 +// public void onResponse(IndexResponse indexResponse) { +// System.out.println(indexResponse.getIndex()); +// System.out.println(indexResponse.getId()); +// System.out.println(indexResponse.getResult()); +// } +// //失败时 +// public void onFailure(Exception e) { +// +// } +// }; +// +// client.indexAsync(request, RequestOptions.DEFAULT, listener); +// try { +// Thread.sleep(5000); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } +// 3获取结果 + System.out.println(indexResponse.getIndex()); + System.out.println(indexResponse.getId()); + System.out.println(indexResponse.getResult()); + if (indexResponse.getResult() == DocWriteResponse.Result.CREATED) { + DocWriteResponse.Result result = indexResponse.getResult(); + System.out.println("CREATE" + result); + } else if (indexResponse.getResult() == DocWriteResponse.Result.UPDATED) { + DocWriteResponse.Result result = indexResponse.getResult(); + System.out.println("UPDATED" + result); + } else { + } +// "_shards" : { +// "total" : 2, +// "successful" : 1, +// "failed" : 0 +// } + ReplicationResponse.ShardInfo shardInfo = indexResponse.getShardInfo(); + if (shardInfo.getTotal() != shardInfo.getSuccessful()) { + System.out.println("处理成功的分片数少于总分片!"); + } + if (shardInfo.getFailed() > 0) { + for (ReplicationResponse.ShardInfo.Failure failure : shardInfo.getFailures()) { + String reason = failure.reason();//每一个错误的原因 + System.out.println(reason); + } + } + } + + @Test + public void testUpdate() throws IOException { +// POST test_post/_doc/3/_update +// { +// "doc":{ +// "user":"tomas Lee" +// } +// } +// 1创建请求 + UpdateRequest request = new UpdateRequest("test_post", "3"); + Map jsonMap = new HashMap<>(); + jsonMap.put("user", "tomas Lee"); + request.doc(jsonMap); +// =========可选参数======== + request.timeout("1s"); + request.retryOnConflict(3);//重试次数 +// 2执行 + //同步 + UpdateResponse updateResponse = client.update(request, RequestOptions.DEFAULT); + //异步 +// 3获取结果 + updateResponse.getId(); + updateResponse.getIndex(); + //判断结果 + if (updateResponse.getResult() == DocWriteResponse.Result.CREATED) { + DocWriteResponse.Result result = updateResponse.getResult(); + System.out.println("CREATED:" + result); + } else if (updateResponse.getResult() == DocWriteResponse.Result.UPDATED) { + DocWriteResponse.Result result = updateResponse.getResult(); + System.out.println("UPDATED:" + result); + } else if (updateResponse.getResult() == DocWriteResponse.Result.DELETED) { + DocWriteResponse.Result result = updateResponse.getResult(); + System.out.println("DELETED:" + result); + } else if (updateResponse.getResult() == DocWriteResponse.Result.NOOP) { + //没有操作 + DocWriteResponse.Result result = updateResponse.getResult(); + System.out.println("NOOP:" + result); + } + } + + @Test + public void testDelete() throws IOException { +// 1创建请求 + DeleteRequest request = new DeleteRequest("test_post", "3"); +//可选参数 +// 2执行 + DeleteResponse deleteResponse = client.delete(request, RequestOptions.DEFAULT); +// 3获取结果 + deleteResponse.getId(); + deleteResponse.getIndex(); + DocWriteResponse.Result result = deleteResponse.getResult(); + System.out.println(result); + } + + @Test + public void testBulk() throws IOException { + // 1创建请求 + BulkRequest request = new BulkRequest(); +// request.add(new IndexRequest("post").id("1").source(XContentType.JSON,"field","1" )); +// request.add(new IndexRequest("post").id("2").source(XContentType.JSON,"field","2" )); + request.add(new UpdateRequest("post", "1").doc(XContentType.JSON, "field", "3")); + request.add(new DeleteRequest("post").id("2")); + // 2执行 + BulkResponse bulkResponse = client.bulk(request, RequestOptions.DEFAULT); + // 3获取结果 + for (BulkItemResponse itemResponse : bulkResponse) { + DocWriteResponse response = itemResponse.getResponse(); + switch (itemResponse.getOpType()) { + case INDEX: + IndexResponse indexResponse = (IndexResponse) response; + System.out.println("INDEX:" + indexResponse.getResult()); + break; + case CREATE: + IndexResponse createResponse = (IndexResponse) response; + System.out.println("CREATE:" + createResponse.getResult()); + break; + case UPDATE: + UpdateResponse updateResponse = (UpdateResponse) response; + System.out.println("UPDATE:" + updateResponse.getResult()); + break; + case DELETE: + DeleteResponse deleteResponse = (DeleteResponse) response; + System.out.println("DELETE:" + deleteResponse.getResult()); + break; + } + } + } +} \ No newline at end of file