1.Java连接Elasticsearch
1.1 创建SprinBoot工程,导入依赖
记得先在命令行中把elasticsearch启动,kibana最好也启动起来
<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>6.8.10</version><exclusions><exclusion><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId></exclusion><exclusion><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-client</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-client</artifactId><version>6.8.10</version></dependency><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>6.8.10</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>
1.2 创建测试类,连接Elasticsearch
utils包下新建一个ESClient获取Elasticsearch代理
public class ESClient {public static RestHighLevelClient getClient(){//创建HttpHost对象HttpHost httpHost = new HttpHost("127.0.0.1",9200);//创建RestClientBuilderRestClientBuilder clientBuilder = RestClient.builder(httpHost);//创建RestHighLevelClientRestHighLevelClient client = new RestHighLevelClient(clientBuilder);//返回return client;}}
@SpringBootTest@ContextConfiguration(classes = ForumApplication.class)public class demo1 {@Testpublic void testConnection(){RestHighLevelClient client = ESClient.getClient();System.out.println("成功!!!");}}
2.Java操作索引
2.1 创建索引
public class demo2 {RestHighLevelClient client = ESClient.getClient();String index = "person";String type = "man";/*** 创建索引* @throws IOException*/@Testpublic void createIndex() throws IOException {//1. 准备关于索引的settingsSettings.Builder settings = Settings.builder().put("number_of_shards", 3).put("number_of_replicas", 1);//2. 准备关于索引的结构mappingsXContentBuilder mappings = JsonXContent.contentBuilder().startObject().startObject("properties").startObject("name").field("type","text").endObject().startObject("age").field("type","integer").endObject().startObject("birthday").field("type","date").field("format","yyyy-MM-dd").endObject().endObject().endObject();//3. 将settings和mappings封装到一个Request对象CreateIndexRequest request = new CreateIndexRequest(index).settings(settings).mapping(type,mappings);//4. 通过client对象去连接ES并执行创建索引CreateIndexResponse resp = client.indices().create(request, RequestOptions.DEFAULT);//5. 输出System.out.println("resp:" + resp.toString());}}
2.2 检查索引是否存在
@Testpublic void exists() throws IOException{//1.准备request对象GetIndexRequest request = new GetIndexRequest();request.indices(index);//2.通过client去操作boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);//3.输出System.out.println(exists);}
2.3 删除索引
@Testpublic void delete() throws Exception{//1.准备request对象DeleteIndexRequest request = new DeleteIndexRequest();request.indices(index);//2.通过client对象执行AcknowledgedResponse delete = client.indices().delete(request,RequestOptions.DEFAULT);//3.获取返回结果System.out.println(delete.isAcknowledged());}
3.Java操作文档
3.1 添加文档
@Testpublic void createDoc() throws Exception{//1.准备一个json数据Person person = new Person(1, "张三", 23, new Date());String json = mapper.writeValueAsString(person);//2.准备一个request对象(手动指定id)IndexRequest request = new IndexRequest(index, type, person.getId().toString());request.source(json, XContentType.JSON);//3.通过client对象执行添加IndexResponse resp = client.index(request, RequestOptions.DEFAULT);//4.输出返回结果System.out.println(resp.getResult().toString());}
3.2 修改文档
@Testpublic void updateDoc() throws Exception{//1.创建一个Map,修改制定内容HashMap<String, Object> doc = new HashMap<>();doc.put("name","张大仙");String docId = "1";//2.创建request对象,封装数据UpdateRequest request = new UpdateRequest(index, type, docId);request.doc(doc);//3.通过client对象执行UpdateResponse update = client.update(request, RequestOptions.DEFAULT);//4.输出返回结果System.out.println(update.getResult().toString());}
3.3 删除文档
@Testpublic void deleteDoc() throws Exception{//1.封装Request对象DeleteRequest request = new DeleteRequest(index,type,"1");//2.client执行删除DeleteResponse resp = client.delete(request, RequestOptions.DEFAULT);//3.输出结果System.out.println(resp.getResult().toString());}
3.4 批量添加文档
@Testpublic void bulkCreateDoc() throws Exception{//1.准备多个json数据Person p1 = new Person(1, "张三", 23, new Date());Person p2 = new Person(2, "李四", 24, new Date());Person p3 = new Person(3, "王五", 25, new Date());String json1 = mapper.writeValueAsString(p1);String json2 = mapper.writeValueAsString(p2);String json3 = mapper.writeValueAsString(p3);//2.创建Request,将准备好的数据封装过去BulkRequest request = new BulkRequest();request.add(new IndexRequest(index,type,p1.getId().toString()).source(json1,XContentType.JSON));request.add(new IndexRequest(index,type,p2.getId().toString()).source(json2,XContentType.JSON));request.add(new IndexRequest(index,type,p3.getId().toString()).source(json3,XContentType.JSON));//3.用client执行BulkResponse resp = client.bulk(request, RequestOptions.DEFAULT);//4.输出结果System.out.println(resp.toString());}
3.4 批量删除文档
@Testpublic void bulkDeleteDoc() throws Exception{//1.封装Request对象BulkRequest request = new BulkRequest();request.add(new DeleteRequest(index,type,"1"));request.add(new DeleteRequest(index,type,"2"));request.add(new DeleteRequest(index,type,"3"));//2.client执行BulkResponse resp = client.bulk(request, RequestOptions.DEFAULT);//3.输出System.out.println(resp);}
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 创建一个实体类
@Data@NoArgsConstructor@AllArgsConstructorpublic class SmsLogs {private String id;// 唯一ID 1private Date createDate;// 创建时间private Date sendDate; // 发送时间private String longCode;// 发送的长号码private String mobile;// 下发手机号private String corpName;// 发送公司名称private String smsContent; // 下发短信内容private Integer state; // 短信下发状态 0 成功 1 失败private Integer operatorId; // '运营商编号 1 移动 2 联通 3 电信private String province;// 省份private String ipAddr; //下发服务器IP地址private Integer replyTotal; //短信状态报告返回时长(秒)private Integer fee; // 费用}
4.3 创建索引
public class exe1 {ObjectMapper mapper = new ObjectMapper();RestHighLevelClient client = ESClient.getClient();String index = "sms-logs-index";String type = "sms-logs-type";@Testpublic void createSmsLogsIndex() throws IOException {//1. settingsSettings.Builder settings = Settings.builder().put("number_of_shards", 3).put("number_of_replicas", 1);//2. mapping.XContentBuilder mapping = JsonXContent.contentBuilder().startObject().startObject("properties").startObject("createDate").field("type", "date").endObject().startObject("sendDate").field("type", "date").endObject().startObject("longCode").field("type", "keyword").endObject().startObject("mobile").field("type", "keyword").endObject().startObject("corpName").field("type", "keyword").endObject().startObject("smsContent").field("type", "text").field("analyzer", "ik_max_word").endObject().startObject("state").field("type", "integer").endObject().startObject("operatorId").field("type", "integer").endObject().startObject("province").field("type", "keyword").endObject().startObject("ipAddr").field("type", "ip").endObject().startObject("replyTotal").field("type", "integer").endObject().startObject("fee").field("type", "long").endObject().endObject().endObject();//3. 添加索引.CreateIndexRequest request = new CreateIndexRequest(index);request.settings(settings);request.mapping(type,mapping);client.indices().create(request, RequestOptions.DEFAULT);System.out.println("OK!!");}}
4.4 添加文档
@Testpublic void addTestData() throws IOException {BulkRequest request = new BulkRequest();SmsLogs smsLogs = new SmsLogs();smsLogs.setMobile("13800000000");smsLogs.setCorpName("途虎养车");smsLogs.setCreateDate(new Date());smsLogs.setSendDate(new Date());smsLogs.setIpAddr("10.126.2.9");smsLogs.setLongCode("10690000988");smsLogs.setReplyTotal(10);smsLogs.setState(0);smsLogs.setSmsContent("【途虎养车】亲爱的张三先生/女士,您在途虎购买的货品(单号TH123456)已 到指定安装店多日," + "现需与您确认订单的安装情况,请点击链接按实际情况选择(此链接有效期为72H)。您也可以登录途 虎APP进入" + "“我的-待安装订单”进行预约安装。若您在服务过程中有任何疑问,请致电400-111-8868向途虎咨 询。");smsLogs.setProvince("北京");smsLogs.setOperatorId(1);smsLogs.setFee(3);request.add(new IndexRequest(index, type, "21").source(mapper.writeValueAsString(smsLogs), XContentType.JSON));smsLogs.setMobile("13700000001");smsLogs.setProvince("上海");smsLogs.setSmsContent("【途虎养车】亲爱的刘红先生/女士,您在途虎购买的货品(单号TH1234526)已 到指定安装店多日," + "现需与您确认订单的安装情况,请点击链接按实际情况选择(此链接有效期为72H)。您也可以登录途 虎APP进入" + "“我的-待安装订单”进行预约安装。若您在服务过程中有任何疑问,请致电400-111-8868向途虎咨 询。");request.add(new IndexRequest(index, type, "22").source(mapper.writeValueAsString(smsLogs), XContentType.JSON));// -------------------------------------------------------------------------------------------------------------------SmsLogs smsLogs1 = new SmsLogs();smsLogs1.setMobile("13100000000");smsLogs1.setCorpName("盒马鲜生");smsLogs1.setCreateDate(new Date());smsLogs1.setSendDate(new Date());smsLogs1.setIpAddr("10.126.2.9");smsLogs1.setLongCode("10660000988");smsLogs1.setReplyTotal(15);smsLogs1.setState(0);smsLogs1.setSmsContent("【盒马】您尾号12345678的订单已开始配送,请在您指定的时间收货不要走开 哦~配送员:" + "刘三,电话:13800000000");smsLogs1.setProvince("北京");smsLogs1.setOperatorId(2);smsLogs1.setFee(5);request.add(new IndexRequest(index, type, "23").source(mapper.writeValueAsString(smsLogs1), XContentType.JSON));smsLogs1.setMobile("18600000001");smsLogs1.setProvince("上海");smsLogs1.setSmsContent("【盒马】您尾号7775678的订单已开始配送,请在您指定的时间收货不要走开 哦~配送员:" + "王五,电话:13800000001");request.add(new IndexRequest(index, type, "24").source(mapper.writeValueAsString(smsLogs1), XContentType.JSON));// -------------------------------------------------------------------------------------------------------------------SmsLogs smsLogs2 = new SmsLogs();smsLogs2.setMobile("15300000000");smsLogs2.setCorpName("滴滴打车");smsLogs2.setCreateDate(new Date());smsLogs2.setSendDate(new Date());smsLogs2.setIpAddr("10.126.2.8");smsLogs2.setLongCode("10660000988");smsLogs2.setReplyTotal(50);smsLogs2.setState(1);smsLogs2.setSmsContent("【滴滴单车平台】专属限时福利!青桔/小蓝月卡立享5折,特惠畅骑30天。" + "戳 https://xxxxxx退订TD");smsLogs2.setProvince("上海");smsLogs2.setOperatorId(3);smsLogs2.setFee(7);request.add(new IndexRequest(index, type, "25").source(mapper.writeValueAsString(smsLogs2), XContentType.JSON));smsLogs2.setMobile("18000000001");smsLogs2.setProvince("武汉");smsLogs2.setSmsContent("【滴滴单车平台】专属限时福利!青桔/小蓝月卡立享5折,特惠畅骑30天。" + "戳 https://xxxxxx退订TD");request.add(new IndexRequest(index, type, "26").source(mapper.writeValueAsString(smsLogs2), XContentType.JSON));// -------------------------------------------------------------------------------------------------------------------SmsLogs smsLogs3 = new SmsLogs();smsLogs3.setMobile("13900000000");smsLogs3.setCorpName("招商银行");smsLogs3.setCreateDate(new Date());smsLogs3.setSendDate(new Date());smsLogs3.setIpAddr("10.126.2.8");smsLogs3.setLongCode("10690000988");smsLogs3.setReplyTotal(50);smsLogs3.setState(0);smsLogs3.setSmsContent("【招商银行】尊贵的李四先生,恭喜您获得华为P30 Pro抽奖资格,还可领100 元打" + "车红包,仅限1天");smsLogs3.setProvince("上海");smsLogs3.setOperatorId(1);smsLogs3.setFee(8);request.add(new IndexRequest(index, type, "27").source(mapper.writeValueAsString(smsLogs3), XContentType.JSON));smsLogs3.setMobile("13990000001");smsLogs3.setProvince("武汉");smsLogs3.setSmsContent("【招商银行】尊贵的李四先生,恭喜您获得华为P30 Pro抽奖资格,还可领100 元打" + "车红包,仅限1天");request.add(new IndexRequest(index, type, "28").source(mapper.writeValueAsString(smsLogs3), XContentType.JSON));// -------------------------------------------------------------------------------------------------------------------SmsLogs smsLogs4 = new SmsLogs();smsLogs4.setMobile("13700000000");smsLogs4.setCorpName("中国平安保险有限公司");smsLogs4.setCreateDate(new Date());smsLogs4.setSendDate(new Date());smsLogs4.setIpAddr("10.126.2.8");smsLogs4.setLongCode("10690000998");smsLogs4.setReplyTotal(18);smsLogs4.setState(0);smsLogs4.setSmsContent("【中国平安】奋斗的时代,更需要健康的身体。中国平安为您提供多重健康保 障,在奋斗之路上为您保驾护航。退订请回复TD");smsLogs4.setProvince("武汉");smsLogs4.setOperatorId(1);smsLogs4.setFee(5);request.add(new IndexRequest(index, type, "29").source(mapper.writeValueAsString(smsLogs4), XContentType.JSON));smsLogs4.setMobile("13990000002");smsLogs4.setProvince("武汉");smsLogs4.setSmsContent("【招商银行】尊贵的王五先生,恭喜您获得iphone 56抽奖资格,还可领5 元打" + "车红包,仅限100天");request.add(new IndexRequest(index, type, "30").source(mapper.writeValueAsString(smsLogs4), XContentType.JSON));// -------------------------------------------------------------------------------------------------------------------SmsLogs smsLogs5 = new SmsLogs();smsLogs5.setMobile("13600000000");smsLogs5.setCorpName("中国移动");smsLogs5.setCreateDate(new Date());smsLogs5.setSendDate(new Date());smsLogs5.setIpAddr("10.126.2.8");smsLogs5.setLongCode("10650000998");smsLogs5.setReplyTotal(60);smsLogs5.setState(0);smsLogs5.setSmsContent("【北京移动】尊敬的客户137****0000,5月话费账单已送达您的139邮箱," + "点击查看账单详情 http://y.10086.cn/; " + " 回Q关闭通知,关注“中国移动139邮箱”微信随时查账单【中国移动 139邮箱】");smsLogs5.setProvince("武汉");smsLogs5.setOperatorId(1);smsLogs5.setFee(4);request.add(new IndexRequest(index, type, "31").source(mapper.writeValueAsString(smsLogs5), XContentType.JSON));smsLogs5.setMobile("13990001234");smsLogs5.setProvince("山西");smsLogs5.setSmsContent("【北京移动】尊敬的客户137****1234,8月话费账单已送达您的126邮箱,\" + \"点击查看账单详情 http://y.10086.cn/; \" + \" 回Q关闭通知,关注“中国移动126邮箱”微信随时查账单【中国移动 126邮箱】");request.add(new IndexRequest(index, type, "32").source(mapper.writeValueAsString(smsLogs5), XContentType.JSON));// -------------------------------------------------------------------------------------------------------------------client.bulk(request,RequestOptions.DEFAULT);System.out.println("OK!");}
