ElasticSearch 实现分词全文检索 - 测试数据准备

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: ElasticSearch 实现分词全文检索 - 测试数据准备

准备数据

字段名称 类型 备注
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());
}

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
1月前
|
分布式计算 Shell MaxCompute
odps测试表及大量数据构建测试
odps测试表及大量数据构建测试
|
2月前
|
开发框架 .NET Java
C#集合数据去重的5种方式及其性能对比测试分析
C#集合数据去重的5种方式及其性能对比测试分析
38 11
|
2月前
|
开发框架 .NET Java
C#集合数据去重的5种方式及其性能对比测试分析
C#集合数据去重的5种方式及其性能对比测试分析
55 10
|
3月前
|
机器学习/深度学习 算法 UED
在数据驱动时代,A/B 测试成为评估机器学习项目不同方案效果的重要方法
在数据驱动时代,A/B 测试成为评估机器学习项目不同方案效果的重要方法。本文介绍 A/B 测试的基本概念、步骤及其在模型评估、算法改进、特征选择和用户体验优化中的应用,同时提供 Python 实现示例,强调其在确保项目性能和用户体验方面的关键作用。
67 6
|
3月前
|
机器学习/深度学习 算法 UED
在数据驱动时代,A/B 测试成为评估机器学习项目效果的重要手段
在数据驱动时代,A/B 测试成为评估机器学习项目效果的重要手段。本文介绍了 A/B 测试的基本概念、步骤及其在模型评估、算法改进、特征选择和用户体验优化中的应用,强调了样本量、随机性和时间因素的重要性,并展示了 Python 在 A/B 测试中的具体应用实例。
47 1
|
4月前
|
机器学习/深度学习 监控 计算机视觉
目标检测实战(八): 使用YOLOv7完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
本文介绍了如何使用YOLOv7进行目标检测,包括环境搭建、数据集准备、模型训练、验证、测试以及常见错误的解决方法。YOLOv7以其高效性能和准确率在目标检测领域受到关注,适用于自动驾驶、安防监控等场景。文中提供了源码和论文链接,以及详细的步骤说明,适合深度学习实践者参考。
950 1
目标检测实战(八): 使用YOLOv7完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
|
3月前
|
测试技术 API 开发工具
ElasticSearch的IK分词器
ElasticSearch的IK分词器
115 7
|
4月前
|
存储 测试技术 数据库
数据驱动测试和关键词驱动测试的区别
数据驱动测试 数据驱动测试或 DDT 也被称为参数化测试。
62 1
|
4月前
|
机器学习/深度学习 并行计算 数据可视化
目标分类笔记(二): 利用PaddleClas的框架来完成多标签分类任务(从数据准备到训练测试部署的完整流程)
这篇文章介绍了如何使用PaddleClas框架完成多标签分类任务,包括数据准备、环境搭建、模型训练、预测、评估等完整流程。
256 0
|
4月前
|
机器学习/深度学习 数据采集 算法
目标分类笔记(一): 利用包含多个网络多种训练策略的框架来完成多目标分类任务(从数据准备到训练测试部署的完整流程)
这篇博客文章介绍了如何使用包含多个网络和多种训练策略的框架来完成多目标分类任务,涵盖了从数据准备到训练、测试和部署的完整流程,并提供了相关代码和配置文件。
105 0
目标分类笔记(一): 利用包含多个网络多种训练策略的框架来完成多目标分类任务(从数据准备到训练测试部署的完整流程)

热门文章

最新文章