目录

ElasticSearch 实现分词全文检索 - 概述

ElasticSearch 实现分词全文检索 - ES、Kibana、IK安装

ElasticSearch 实现分词全文检索 - Restful基本操作

ElasticSearch 实现分词全文检索 - Java SpringBoot ES 索引操作

ElasticSearch 实现分词全文检索 - Java SpringBoot ES 文档操作

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

ElasticSearch 实现分词全文检索 - term、terms查询

ElasticSearch 实现分词全文检索 - id、ids、prefix、fuzzy、wildcard、range、regexp 查询 --待发布

ElasticSearch 实现分词全文检索 - Scroll 深分页 --待发布

ElasticSearch 实现分词全文检索 - delete-by-query --待发布

ElasticSearch 实现分词全文检索 - 复合查询 --待发布

ElasticSearch 实现分词全文检索 - filter查询 --待发布

ElasticSearch 实现分词全文检索 - 高亮查询 --待发布

ElasticSearch 实现分词全文检索 - 聚合查询 cardinality --待发布

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;
}
}

创建索引

@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 实现分词全文检索 - 测试数据准备的更多相关文章

  1. PHP+mysql数据库开发搜索功能:中英文分词+全文检索(MySQL全文检索+中文分词(SCWS))

    PHP+mysql数据库开发类似百度的搜索功能:中英文分词+全文检索 中文分词: a)   robbe PHP中文分词扩展: http://www.boyunjian.com/v/softd/robb ...

  2. ElasticSearch中文分词(IK)

    ElasticSearch常用的很受欢迎的是IK,这里稍微介绍下安装过程及测试过程.   1.ElasticSearch官方分词 自带的中文分词器很弱,可以体检下: [zsz@VS-zsz ~]$ c ...

  3. 实战ELK(8) 安装ElasticSearch中文分词器

    安装 方法1 - download pre-build package from here: https://github.com/medcl/elasticsearch-analysis-ik/re ...

  4. Elasticsearch 中文分词(elasticsearch-analysis-ik) 安装

    由于elasticsearch基于lucene,所以天然地就多了许多lucene上的中文分词的支持,比如 IK, Paoding, MMSEG4J等lucene中文分词原理上都能在elasticsea ...

  5. Elasticsearch之分词器的作用

    前提 什么是倒排索引? Analyzer(分词器)的作用是把一段文本中的词按一定规则进行切分.对应的是Analyzer类,这是一个抽象类,切分词的具体规则是由子类实现的,所以对于不同的语言,要用不同的 ...

  6. Elasticsearch之分词器的工作流程

    前提 什么是倒排索引? Elasticsearch之分词器的作用 Elasticsearch的分词器的一般工作流程: 1.切分关键词 2.去除停用词 3.对于英文单词,把所有字母转为小写(搜索时不区分 ...

  7. elasticsearch 拼音+ik分词,spring data elasticsearch 拼音分词

    elasticsearch 自定义分词器 安装拼音分词器.ik分词器 拼音分词器: https://github.com/medcl/elasticsearch-analysis-pinyin/rel ...

  8. elasticsearch 中文分词(elasticsearch-analysis-ik)安装

    elasticsearch 中文分词(elasticsearch-analysis-ik)安装 下载最新的发布版本 https://github.com/medcl/elasticsearch-ana ...

  9. elasticsearch kibana + 分词器安装详细步骤

    elasticsearch kibana + 分词器安装详细步骤 一.准备环境 系统:Centos7 JDK安装包:jdk-8u191-linux-x64.tar.gz ES安装包:elasticse ...

  10. Elasticsearch修改分词器以及自定义分词器

    Elasticsearch修改分词器以及自定义分词器 参考博客:https://blog.csdn.net/shuimofengyang/article/details/88973597

随机推荐

  1. Oracle dump文件的一些经验

    dump文件对于DBA而言再平常不过了.不过因为dump文件是二进制文件,我们平时使用中不太关注.再导入dump文件时有很多细节和技巧是值得注意的. 1.查看dump文件的一些基本信息 strings ...

  2. idea设置类,方法模板 阿里检测

    一.设置IDEA 中的类注释模板File -> Settings -> Editor -> File and Code Templates -> Files /** * @Cl ...

  3. 2022-3-8内部群每日三题-清辉PMP

    1.实践敏捷方法的开发负责人被任命为一个项目的迭代经理,该负责人与使用瀑布式方法的业务分析师密切合作,但这两个方法的差异已经开始对团队绩效产生负面影响,项目经理分别与开发负责人和业务分析师就这种情况进 ...

  4. 逆向学习物联网-网关ESP8266-03软件编程实现

    1.技术原理及流程 1) MQTT数据通讯原理  2).网关协议运行状态机  3). 主程序流程 2.关键程序代码实现 MDK集成开发环境的搭建,大家可以百度搜索,或者参考感知层的软件设计部分. 1) ...

  5. Dos基本命令及批处理

    如何操作DOS命令: 开始----运行----cmd----回车: win+R------运行----cmd----回车: 基本命令: 1.命令:color f0 color ?  寻求帮助 改变背景 ...

  6. noi 1.1 2 输出第二个整数

    描述 输入三个整数,把第二个输入的整数输出. 输入 只有一行,共三个整数,整数之间由一个空格分隔.整数是32位有符号整数. 输出 只有一行,一个整数,即输入的第二个整数. 样例输入 123 456 7 ...

  7. <一>JDK/MAVEN/IDEA/MYSQL/GIT详细环境安装

    一.  安装JDK 1. jdk安装包下载地址:https://www.oracle.com/java/technologies/javase-jdk16-downloads.html 2. 解压缩软 ...

  8. 22 BootStrapModelForm

    方便之处在于,我们不会再一遍一遍的写form的样式了. from django import forms class BootStrapModelForm(forms.ModelForm): def ...

  9. 浏览器垃圾回收机制:栈垃圾回收、堆垃圾回收、新生区老生区、Scavenge算法、标记-清除算法、标记-整理算法、全停顿、增量标记

    浏览器垃圾回收机制根据数据的存储方式分为栈垃圾回收和堆垃圾回收. 栈垃圾回收的方式非常简便,当一个函数执行结束之后,JavaScript 引擎会通过向下移动 ESP 来销毁该函数保存在栈中的执行上下文 ...

  10. sequelize的创建接口以及模糊查询

    第一步: 在routes里面复制index.js更改为xxx.js(例如arctile.js) res.json()返回的就是json文件 第二步: 在views里app.js引用路由 第三步:查找数 ...