准备数据
字段名称 | 类型 | 备注 |
createDate | Date | 创建时间 |
sendDate | Date | 发送时间 |
longCode | String | 发送的长号码,如“1069886622” |
mobile | String | 如: 13800000000 |
corpName | String | 发送公司名称,需要分词检索 |
smsContent | String | 下发短信内容,需要分词检索 |
state | Integer | 短信下发状态 0 成功 1失败 |
operatorld | Integer | 运营商编号 1移动 2 联通 3 电信 |
province | String | 省份 |
ipAddr | String | 下发服务器IP地址 |
replyTotal | Integer | 短信状态报告返回时长 (秒) |
fee | Integer | 扣费 (分) |
SmsLogs 实体
import java.util.Date; public class SmsLogs { /** * 创建时间 */ private Date createDate; /** * 发送时间 */ private Date sendDate; /** * 发送的长号码,如“1069886622” */ private String longCode; /** * 如: 13800000000 */ private String mobile; /** * 发送公司名称,需要分词检索 */ private String corpName; /** * 下发短信内容,需要分词检索 */ private String smsContent; /** * 短信下发状态 0 成功 1失败 */ private Integer state; /** * 运营商编号 1移动 2 联通 3 电信 */ private Integer operatorld; /** * 省份 */ private String province; /** * 下发服务器IP地址 */ private String ipAddr; /** * 短信状态报告返回时长 (秒) */ private Integer replyTotal; /** * 扣费 (分) */ private Integer fee; public Date getCreateDate() { return createDate; } public void setCreateDate(Date createDate) { this.createDate = createDate; } public Date getSendDate() { return sendDate; } public void setSendDate(Date sendDate) { this.sendDate = sendDate; } public String getLongCode() { return longCode; } public void setLongCode(String longCode) { this.longCode = longCode; } public String getMobile() { return mobile; } public void setMobile(String mobile) { this.mobile = mobile; } public String getCorpName() { return corpName; } public void setCorpName(String corpName) { this.corpName = corpName; } public String getSmsContent() { return smsContent; } public void setSmsContent(String smsContent) { this.smsContent = smsContent; } public Integer getState() { return state; } public void setState(Integer state) { this.state = state; } public Integer getOperatorld() { return operatorld; } public void setOperatorld(Integer operatorld) { this.operatorld = operatorld; } public String getProvince() { return province; } public void setProvince(String province) { this.province = province; } public String getIpAddr() { return ipAddr; } public void setIpAddr(String ipAddr) { this.ipAddr = ipAddr; } public Integer getReplyTotal() { return replyTotal; } public void setReplyTotal(Integer replyTotal) { this.replyTotal = replyTotal; } public Integer getFee() { return fee; } public void setFee(Integer fee) { this.fee = fee; } }
Field datatypes
String: text: 一般用于全文检索。将当前的Field进行分词 keyword: 当前 Field 不会被分词 数值类型: long、 integer、 short、 byte、 double、 float、 half_float:精度比float小一半 scaled_float:根据一个long和scaled来表达一个浮点型, long=345,scaled=100 => 3.45 时间类型: date:针对时间类型指定具体格式 布尔类型: boolean:表达true和false 二进制类型: binary:暂时支持Base64 encode string 范围类型(Range datatypes): long_range: 赋值时,无序指定具体的内容,只需要存储一个范围即可,指定gt,此,gte,lte integer_range:同上 double_range:同上 float_range: 同上 date_range:同上 ip_range: 同上。 经纬度类型: geo_point: 用来存储经纬度,结合定位的经纬度,来计算出距离 IP类型 ip: 可以存付IPV4、IPV6 Completion 类型(Completion datatype): completion 提供自动补全建议
创建索引
@Test void createSmsLogsIndex() throws Exception { String indexName = "sms-logs-index"; RestHighLevelClient client = ESClient.getClient(); //1. 准备索引的 settings Settings.Builder settings = Settings.builder() .put("number_of_shards", 1) .put("number_of_replicas", 1); //2. 准备索引的结构 Mappings XContentBuilder mappings = JsonXContent.contentBuilder() .startObject() .startObject("properties") .startObject("createDate").field("type", "date").field("format", "yyyy-MM-dd HH:mm:ss").endObject() .startObject("sendDate").field("type", "date").field("format", "yyyy-MM-dd HH:mm:ss").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("operatorld").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. 将 Settings 和 Mappings 封装到一个Request 对象中 CreateIndexRequest request = new CreateIndexRequest(indexName) .settings(settings) .mapping(mappings); //4. 通过 client 对象去连接ES并执行创建索引 CreateIndexResponse resp = client.indices().create(request, RequestOptions.DEFAULT); //5. 输出 System.out.println("resp:" + resp.toString()); }
创建数据文档
@Test void batchCreateSmsDoc() throws Exception { String indexName = "sms-logs-index"; RestHighLevelClient client = ESClient.getClient(); //短信内容 Map<Integer, String> contentMap = new HashMap<>(); contentMap.put(1, "【阿里云】尊敬的vipsoft:您有2台云服务器ECS配置升级成功。如有CPU、内存变更或0Mbps带宽升级,您需要在ECS控制台手动重启云服务器后才能生效。"); contentMap.put(2, "为更好地为您提供服务,温馨提醒:您本月有1次抽奖机会,赢取大额通用流量,月月抽月月领,点击掌厅链接 原URL:http://wap.js.10086.cn/Mq 快来试试你的运气吧,如本月已参与请忽略【江苏移动心级服务,让爱连接】"); contentMap.put(3, "国家反诈中心提醒:公检法机关会当面向涉案人员出示证件或法律文书,绝对不会通过网络给当事人发送通缉令、拘留证、逮捕证等法律文书,并要求转账汇款。\n" + "切记:公检法机关不存在所谓“安全账户”,更不会让你远程转账汇款!"); contentMap.put(4, "【江苏省公安厅、江苏省通信管理局】温馨提示:近期利用苹果手机iMessage消息冒充熟人、冒充领导换号、添加新微信号等诈骗形式多发。如有收到类似短信,请您谨慎判断,苹果手机用户如无需要可关闭iMessage功能,以免上当受骗。"); contentMap.put(5, "多一点快乐,少一点懊恼,不管钞票有多少,只有天天开心就好,累了就睡觉,生活的甜苦,自己来调味。收到信息就要开心的笑"); contentMap.put(6, "黄金周好运每天交,我把祝福来送到:愿您生活步步高,彩票期期中,股票每天涨,生意年年旺,祝您新年新景象!"); contentMap.put(7, "【阿里云】当你手机响,那是我的问候;当你收到短信,那有我的心声;当你翻阅短信,那有我的牵挂;当你筹备关机时,记得我今天说过周末快乐!"); contentMap.put(8, "我刚去了一趟银行,取了无数的幸福黄金好运珠宝平安翡翠成功股票健康基金。嘘!别作声,统统的送给你,因为我想提“钱”祝你国庆节快乐!"); contentMap.put(9, "一个人的精彩,一个人的打拼,一个人的承载,一个人的舞蹈。光棍节送你祝福,不因你是光棍,只因你生活色彩。祝你:快乐打拼,生活出彩!"); contentMap.put(10, "爆竹响激情燃放,雪花舞祥风欢畅,烟火腾期待闪亮,感动涌心中激荡,心情美春节冲浪,愿景好心中珍藏,祝与福短信奉上:祝您身体健康,兔年吉祥!"); //准备一个JSON数据 List<String> jsonList = new ArrayList<>(); for (int i = 1; i <= 10; i++) { //准备一个JSON数据 SmsLogs sms = new SmsLogs(); sms.setMobile("138" + RandomUtil.randomInt(11111111, 99999999)); sms.setSmsContent(contentMap.get(i)); sms.setState(i % 2); sms.setOperatorld(i % 3); if (i % 2 == 0) { sms.setProvince("江苏"); sms.setLongCode("张三" + i); sms.setCorpName("微软" + i); } else{ sms.setProvince("上海"); sms.setLongCode("李四" + i); sms.setCorpName("阿里" + i); } sms.setIpAddr("172.16.0." + i); sms.setFee(RandomUtil.randomInt(10, 50)); sms.setSendDate(DateUtil.offsetMinute(DateUtil.date(), -2)); sms.setCreateDate(DateUtil.date()); String json = JSON.toJSONStringWithDateFormat(sms, "yyyy-MM-dd HH:mm:ss"); //FastJson 将日期格式化 jsonList.add(json); } //准备一个Request对象 BulkRequest bulkRequest = new BulkRequest(); Integer idx = 1; for (String json : jsonList) { IndexRequest request = new IndexRequest(indexName) .id(idx.toString()) //手动指定ID .source(json, XContentType.JSON); bulkRequest.add(request); idx++; } //通过 Client 对象执行添加 BulkResponse bulk = client.bulk(bulkRequest, RequestOptions.DEFAULT); //输入结果 System.out.println(bulk.toString()); }