1.Java连接Elasticsearch

1.1 创建SprinBoot工程,导入依赖

记得先在命令行中把elasticsearch启动,kibana最好也启动起来

  1. <dependency>
  2. <groupId>org.elasticsearch.client</groupId>
  3. <artifactId>elasticsearch-rest-high-level-client</artifactId>
  4. <version>6.8.10</version>
  5. <exclusions>
  6. <exclusion>
  7. <groupId>org.elasticsearch</groupId>
  8. <artifactId>elasticsearch</artifactId>
  9. </exclusion>
  10. <exclusion>
  11. <groupId>org.elasticsearch.client</groupId>
  12. <artifactId>elasticsearch-rest-client</artifactId>
  13. </exclusion>
  14. </exclusions>
  15. </dependency>
  16. <dependency>
  17. <groupId>org.elasticsearch.client</groupId>
  18. <artifactId>elasticsearch-rest-client</artifactId>
  19. <version>6.8.10</version>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.elasticsearch</groupId>
  23. <artifactId>elasticsearch</artifactId>
  24. <version>6.8.10</version>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.projectlombok</groupId>
  28. <artifactId>lombok</artifactId>
  29. <optional>true</optional>
  30. </dependency>

1.2 创建测试类,连接Elasticsearch

utils包下新建一个ESClient获取Elasticsearch代理

  1. public class ESClient {
  2. public static RestHighLevelClient getClient(){
  3. //创建HttpHost对象
  4. HttpHost httpHost = new HttpHost("127.0.0.1",9200);
  5. //创建RestClientBuilder
  6. RestClientBuilder clientBuilder = RestClient.builder(httpHost);
  7. //创建RestHighLevelClient
  8. RestHighLevelClient client = new RestHighLevelClient(clientBuilder);
  9. //返回
  10. return client;
  11. }
  12. }
  1. @SpringBootTest
  2. @ContextConfiguration(classes = ForumApplication.class)
  3. public class demo1 {
  4. @Test
  5. public void testConnection(){
  6. RestHighLevelClient client = ESClient.getClient();
  7. System.out.println("成功!!!");
  8. }
  9. }

2.Java操作索引

2.1 创建索引

  1. public class demo2 {
  2. RestHighLevelClient client = ESClient.getClient();
  3. String index = "person";
  4. String type = "man";
  5. /**
  6. * 创建索引
  7. * @throws IOException
  8. */
  9. @Test
  10. public void createIndex() throws IOException {
  11. //1. 准备关于索引的settings
  12. Settings.Builder settings = Settings.builder()
  13. .put("number_of_shards", 3)
  14. .put("number_of_replicas", 1);
  15. //2. 准备关于索引的结构mappings
  16. XContentBuilder mappings = JsonXContent.contentBuilder()
  17. .startObject()
  18. .startObject("properties")
  19. .startObject("name")
  20. .field("type","text")
  21. .endObject()
  22. .startObject("age")
  23. .field("type","integer")
  24. .endObject()
  25. .startObject("birthday")
  26. .field("type","date")
  27. .field("format","yyyy-MM-dd")
  28. .endObject()
  29. .endObject()
  30. .endObject();
  31. //3. 将settings和mappings封装到一个Request对象
  32. CreateIndexRequest request = new CreateIndexRequest(index)
  33. .settings(settings)
  34. .mapping(type,mappings);
  35. //4. 通过client对象去连接ES并执行创建索引
  36. CreateIndexResponse resp = client.indices().create(request, RequestOptions.DEFAULT);
  37. //5. 输出
  38. System.out.println("resp:" + resp.toString());
  39. }
  40. }

2.2 检查索引是否存在

  1. @Test
  2. public void exists() throws IOException{
  3. //1.准备request对象
  4. GetIndexRequest request = new GetIndexRequest();
  5. request.indices(index);
  6. //2.通过client去操作
  7. boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
  8. //3.输出
  9. System.out.println(exists);
  10. }

2.3 删除索引

  1. @Test
  2. public void delete() throws Exception{
  3. //1.准备request对象
  4. DeleteIndexRequest request = new DeleteIndexRequest();
  5. request.indices(index);
  6. //2.通过client对象执行
  7. AcknowledgedResponse delete = client.indices().delete(request,RequestOptions.DEFAULT);
  8. //3.获取返回结果
  9. System.out.println(delete.isAcknowledged());
  10. }

3.Java操作文档

3.1 添加文档

  1. @Test
  2. public void createDoc() throws Exception{
  3. //1.准备一个json数据
  4. Person person = new Person(1, "张三", 23, new Date());
  5. String json = mapper.writeValueAsString(person);
  6. //2.准备一个request对象(手动指定id)
  7. IndexRequest request = new IndexRequest(index, type, person.getId().toString());
  8. request.source(json, XContentType.JSON);
  9. //3.通过client对象执行添加
  10. IndexResponse resp = client.index(request, RequestOptions.DEFAULT);
  11. //4.输出返回结果
  12. System.out.println(resp.getResult().toString());
  13. }

3.2 修改文档

  1. @Test
  2. public void updateDoc() throws Exception{
  3. //1.创建一个Map,修改制定内容
  4. HashMap<String, Object> doc = new HashMap<>();
  5. doc.put("name","张大仙");
  6. String docId = "1";
  7. //2.创建request对象,封装数据
  8. UpdateRequest request = new UpdateRequest(index, type, docId);
  9. request.doc(doc);
  10. //3.通过client对象执行
  11. UpdateResponse update = client.update(request, RequestOptions.DEFAULT);
  12. //4.输出返回结果
  13. System.out.println(update.getResult().toString());
  14. }

3.3 删除文档

  1. @Test
  2. public void deleteDoc() throws Exception{
  3. //1.封装Request对象
  4. DeleteRequest request = new DeleteRequest(index,type,"1");
  5. //2.client执行删除
  6. DeleteResponse resp = client.delete(request, RequestOptions.DEFAULT);
  7. //3.输出结果
  8. System.out.println(resp.getResult().toString());
  9. }

3.4 批量添加文档

  1. @Test
  2. public void bulkCreateDoc() throws Exception{
  3. //1.准备多个json数据
  4. Person p1 = new Person(1, "张三", 23, new Date());
  5. Person p2 = new Person(2, "李四", 24, new Date());
  6. Person p3 = new Person(3, "王五", 25, new Date());
  7. String json1 = mapper.writeValueAsString(p1);
  8. String json2 = mapper.writeValueAsString(p2);
  9. String json3 = mapper.writeValueAsString(p3);
  10. //2.创建Request,将准备好的数据封装过去
  11. BulkRequest request = new BulkRequest();
  12. request.add(new IndexRequest(index,type,p1.getId().toString()).source(json1,XContentType.JSON));
  13. request.add(new IndexRequest(index,type,p2.getId().toString()).source(json2,XContentType.JSON));
  14. request.add(new IndexRequest(index,type,p3.getId().toString()).source(json3,XContentType.JSON));
  15. //3.用client执行
  16. BulkResponse resp = client.bulk(request, RequestOptions.DEFAULT);
  17. //4.输出结果
  18. System.out.println(resp.toString());
  19. }

3.4 批量删除文档

  1. @Test
  2. public void bulkDeleteDoc() throws Exception{
  3. //1.封装Request对象
  4. BulkRequest request = new BulkRequest();
  5. request.add(new DeleteRequest(index,type,"1"));
  6. request.add(new DeleteRequest(index,type,"2"));
  7. request.add(new DeleteRequest(index,type,"3"));
  8. //2.client执行
  9. BulkResponse resp = client.bulk(request, RequestOptions.DEFAULT);
  10. //3.输出
  11. System.out.println(resp);
  12. }

4.Java操作Elasticsearch的一个练习

4.1 要求说明

创建索引,指定各个字段的类型
索引名:sms-logs-index
类型名:sms-logs-type

索引结构图

字段名称 备注
createDate 创建时间
sendDate 发送时间
longCode 发送的长号码,如”1069886622”
mobile 下发手机号,如:13800000000
corpName 发送公司名称,需要分词检索
smsContent 下发短信内容,需要分词检索
state 短信下发状态,0成功,1失败
operatorId 运营商编号,1移动,2联通,3电信
province 省份
ipAddr 下发服务器ip地址
replyTotal 短信状态报告返回时长(秒)
fee 扣费(分)

4.2 创建一个实体类

  1. @Data
  2. @NoArgsConstructor
  3. @AllArgsConstructor
  4. public class SmsLogs {
  5. private String id;// 唯一ID 1
  6. private Date createDate;// 创建时间
  7. private Date sendDate; // 发送时间
  8. private String longCode;// 发送的长号码
  9. private String mobile;// 下发手机号
  10. private String corpName;// 发送公司名称
  11. private String smsContent; // 下发短信内容
  12. private Integer state; // 短信下发状态 0 成功 1 失败
  13. private Integer operatorId; // '运营商编号 1 移动 2 联通 3 电信
  14. private String province;// 省份
  15. private String ipAddr; //下发服务器IP地址
  16. private Integer replyTotal; //短信状态报告返回时长(秒)
  17. private Integer fee; // 费用
  18. }

4.3 创建索引

  1. public class exe1 {
  2. ObjectMapper mapper = new ObjectMapper();
  3. RestHighLevelClient client = ESClient.getClient();
  4. String index = "sms-logs-index";
  5. String type = "sms-logs-type";
  6. @Test
  7. public void createSmsLogsIndex() throws IOException {
  8. //1. settings
  9. Settings.Builder settings = Settings.builder()
  10. .put("number_of_shards", 3)
  11. .put("number_of_replicas", 1);
  12. //2. mapping.
  13. XContentBuilder mapping = JsonXContent.contentBuilder()
  14. .startObject()
  15. .startObject("properties")
  16. .startObject("createDate")
  17. .field("type", "date")
  18. .endObject()
  19. .startObject("sendDate")
  20. .field("type", "date")
  21. .endObject()
  22. .startObject("longCode")
  23. .field("type", "keyword")
  24. .endObject()
  25. .startObject("mobile")
  26. .field("type", "keyword")
  27. .endObject()
  28. .startObject("corpName")
  29. .field("type", "keyword")
  30. .endObject()
  31. .startObject("smsContent")
  32. .field("type", "text")
  33. .field("analyzer", "ik_max_word")
  34. .endObject()
  35. .startObject("state")
  36. .field("type", "integer")
  37. .endObject()
  38. .startObject("operatorId")
  39. .field("type", "integer")
  40. .endObject()
  41. .startObject("province")
  42. .field("type", "keyword")
  43. .endObject()
  44. .startObject("ipAddr")
  45. .field("type", "ip")
  46. .endObject()
  47. .startObject("replyTotal")
  48. .field("type", "integer")
  49. .endObject()
  50. .startObject("fee")
  51. .field("type", "long")
  52. .endObject()
  53. .endObject()
  54. .endObject();
  55. //3. 添加索引.
  56. CreateIndexRequest request = new CreateIndexRequest(index);
  57. request.settings(settings);
  58. request.mapping(type,mapping);
  59. client.indices().create(request, RequestOptions.DEFAULT);
  60. System.out.println("OK!!");
  61. }
  62. }

4.4 添加文档

  1. @Test
  2. public void addTestData() throws IOException {
  3. BulkRequest request = new BulkRequest();
  4. SmsLogs smsLogs = new SmsLogs();
  5. smsLogs.setMobile("13800000000");
  6. smsLogs.setCorpName("途虎养车");
  7. smsLogs.setCreateDate(new Date());
  8. smsLogs.setSendDate(new Date());
  9. smsLogs.setIpAddr("10.126.2.9");
  10. smsLogs.setLongCode("10690000988");
  11. smsLogs.setReplyTotal(10);
  12. smsLogs.setState(0);
  13. smsLogs.setSmsContent("【途虎养车】亲爱的张三先生/女士,您在途虎购买的货品(单号TH123456)已 到指定安装店多日," + "现需与您确认订单的安装情况,请点击链接按实际情况选择(此链接有效期为72H)。您也可以登录途 虎APP进入" + "“我的-待安装订单”进行预约安装。若您在服务过程中有任何疑问,请致电400-111-8868向途虎咨 询。");
  14. smsLogs.setProvince("北京");
  15. smsLogs.setOperatorId(1);
  16. smsLogs.setFee(3);
  17. request.add(new IndexRequest(index, type, "21").source(mapper.writeValueAsString(smsLogs), XContentType.JSON));
  18. smsLogs.setMobile("13700000001");
  19. smsLogs.setProvince("上海");
  20. smsLogs.setSmsContent("【途虎养车】亲爱的刘红先生/女士,您在途虎购买的货品(单号TH1234526)已 到指定安装店多日," + "现需与您确认订单的安装情况,请点击链接按实际情况选择(此链接有效期为72H)。您也可以登录途 虎APP进入" + "“我的-待安装订单”进行预约安装。若您在服务过程中有任何疑问,请致电400-111-8868向途虎咨 询。");
  21. request.add(new IndexRequest(index, type, "22").source(mapper.writeValueAsString(smsLogs), XContentType.JSON));
  22. // -------------------------------------------------------------------------------------------------------------------
  23. SmsLogs smsLogs1 = new SmsLogs();
  24. smsLogs1.setMobile("13100000000");
  25. smsLogs1.setCorpName("盒马鲜生");
  26. smsLogs1.setCreateDate(new Date());
  27. smsLogs1.setSendDate(new Date());
  28. smsLogs1.setIpAddr("10.126.2.9");
  29. smsLogs1.setLongCode("10660000988");
  30. smsLogs1.setReplyTotal(15);
  31. smsLogs1.setState(0);
  32. smsLogs1.setSmsContent("【盒马】您尾号12345678的订单已开始配送,请在您指定的时间收货不要走开 哦~配送员:" + "刘三,电话:13800000000");
  33. smsLogs1.setProvince("北京");
  34. smsLogs1.setOperatorId(2);
  35. smsLogs1.setFee(5);
  36. request.add(new IndexRequest(index, type, "23").source(mapper.writeValueAsString(smsLogs1), XContentType.JSON));
  37. smsLogs1.setMobile("18600000001");
  38. smsLogs1.setProvince("上海");
  39. smsLogs1.setSmsContent("【盒马】您尾号7775678的订单已开始配送,请在您指定的时间收货不要走开 哦~配送员:" + "王五,电话:13800000001");
  40. request.add(new IndexRequest(index, type, "24").source(mapper.writeValueAsString(smsLogs1), XContentType.JSON));
  41. // -------------------------------------------------------------------------------------------------------------------
  42. SmsLogs smsLogs2 = new SmsLogs();
  43. smsLogs2.setMobile("15300000000");
  44. smsLogs2.setCorpName("滴滴打车");
  45. smsLogs2.setCreateDate(new Date());
  46. smsLogs2.setSendDate(new Date());
  47. smsLogs2.setIpAddr("10.126.2.8");
  48. smsLogs2.setLongCode("10660000988");
  49. smsLogs2.setReplyTotal(50);
  50. smsLogs2.setState(1);
  51. smsLogs2.setSmsContent("【滴滴单车平台】专属限时福利!青桔/小蓝月卡立享5折,特惠畅骑30天。" + "戳 https://xxxxxx退订TD");
  52. smsLogs2.setProvince("上海");
  53. smsLogs2.setOperatorId(3);
  54. smsLogs2.setFee(7);
  55. request.add(new IndexRequest(index, type, "25").source(mapper.writeValueAsString(smsLogs2), XContentType.JSON));
  56. smsLogs2.setMobile("18000000001");
  57. smsLogs2.setProvince("武汉");
  58. smsLogs2.setSmsContent("【滴滴单车平台】专属限时福利!青桔/小蓝月卡立享5折,特惠畅骑30天。" + "戳 https://xxxxxx退订TD");
  59. request.add(new IndexRequest(index, type, "26").source(mapper.writeValueAsString(smsLogs2), XContentType.JSON));
  60. // -------------------------------------------------------------------------------------------------------------------
  61. SmsLogs smsLogs3 = new SmsLogs();
  62. smsLogs3.setMobile("13900000000");
  63. smsLogs3.setCorpName("招商银行");
  64. smsLogs3.setCreateDate(new Date());
  65. smsLogs3.setSendDate(new Date());
  66. smsLogs3.setIpAddr("10.126.2.8");
  67. smsLogs3.setLongCode("10690000988");
  68. smsLogs3.setReplyTotal(50);
  69. smsLogs3.setState(0);
  70. smsLogs3.setSmsContent("【招商银行】尊贵的李四先生,恭喜您获得华为P30 Pro抽奖资格,还可领100 元打" + "车红包,仅限1天");
  71. smsLogs3.setProvince("上海");
  72. smsLogs3.setOperatorId(1);
  73. smsLogs3.setFee(8);
  74. request.add(new IndexRequest(index, type, "27").source(mapper.writeValueAsString(smsLogs3), XContentType.JSON));
  75. smsLogs3.setMobile("13990000001");
  76. smsLogs3.setProvince("武汉");
  77. smsLogs3.setSmsContent("【招商银行】尊贵的李四先生,恭喜您获得华为P30 Pro抽奖资格,还可领100 元打" + "车红包,仅限1天");
  78. request.add(new IndexRequest(index, type, "28").source(mapper.writeValueAsString(smsLogs3), XContentType.JSON));
  79. // -------------------------------------------------------------------------------------------------------------------
  80. SmsLogs smsLogs4 = new SmsLogs();
  81. smsLogs4.setMobile("13700000000");
  82. smsLogs4.setCorpName("中国平安保险有限公司");
  83. smsLogs4.setCreateDate(new Date());
  84. smsLogs4.setSendDate(new Date());
  85. smsLogs4.setIpAddr("10.126.2.8");
  86. smsLogs4.setLongCode("10690000998");
  87. smsLogs4.setReplyTotal(18);
  88. smsLogs4.setState(0);
  89. smsLogs4.setSmsContent("【中国平安】奋斗的时代,更需要健康的身体。中国平安为您提供多重健康保 障,在奋斗之路上为您保驾护航。退订请回复TD");
  90. smsLogs4.setProvince("武汉");
  91. smsLogs4.setOperatorId(1);
  92. smsLogs4.setFee(5);
  93. request.add(new IndexRequest(index, type, "29").source(mapper.writeValueAsString(smsLogs4), XContentType.JSON));
  94. smsLogs4.setMobile("13990000002");
  95. smsLogs4.setProvince("武汉");
  96. smsLogs4.setSmsContent("【招商银行】尊贵的王五先生,恭喜您获得iphone 56抽奖资格,还可领5 元打" + "车红包,仅限100天");
  97. request.add(new IndexRequest(index, type, "30").source(mapper.writeValueAsString(smsLogs4), XContentType.JSON));
  98. // -------------------------------------------------------------------------------------------------------------------
  99. SmsLogs smsLogs5 = new SmsLogs();
  100. smsLogs5.setMobile("13600000000");
  101. smsLogs5.setCorpName("中国移动");
  102. smsLogs5.setCreateDate(new Date());
  103. smsLogs5.setSendDate(new Date());
  104. smsLogs5.setIpAddr("10.126.2.8");
  105. smsLogs5.setLongCode("10650000998");
  106. smsLogs5.setReplyTotal(60);
  107. smsLogs5.setState(0);
  108. smsLogs5.setSmsContent("【北京移动】尊敬的客户137****0000,5月话费账单已送达您的139邮箱," + "点击查看账单详情 http://y.10086.cn/; " + " 回Q关闭通知,关注“中国移动139邮箱”微信随时查账单【中国移动 139邮箱】");
  109. smsLogs5.setProvince("武汉");
  110. smsLogs5.setOperatorId(1);
  111. smsLogs5.setFee(4);
  112. request.add(new IndexRequest(index, type, "31").source(mapper.writeValueAsString(smsLogs5), XContentType.JSON));
  113. smsLogs5.setMobile("13990001234");
  114. smsLogs5.setProvince("山西");
  115. smsLogs5.setSmsContent("【北京移动】尊敬的客户137****1234,8月话费账单已送达您的126邮箱,\" + \"点击查看账单详情 http://y.10086.cn/; \" + \" 回Q关闭通知,关注“中国移动126邮箱”微信随时查账单【中国移动 126邮箱】");
  116. request.add(new IndexRequest(index, type, "32").source(mapper.writeValueAsString(smsLogs5), XContentType.JSON));
  117. // -------------------------------------------------------------------------------------------------------------------
  118. client.bulk(request,RequestOptions.DEFAULT);
  119. System.out.println("OK!");
  120. }