数据库-Elasticsearch进阶学习笔记(分片、映射、分词器、即时搜索、全文搜索等

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以点击这里获取

  }
}

}
}


properties添加字段,fields使一个字段在不同类型搜索时是否可分析  
 city字段全文检索  
 city.raw字段是city的keyword版本,可被用于排序和聚合操作。  
 接下来先了解字段等概念,之后再配合搜索对映射进行深入理解。


#### 常见数据类型


* boolean:true、false
* Numeric:
	+ byte:8位有符号整数
	+ short:16位有符号整数
	+ integer:32位有符号整数
	+ long、unsigned\_long:有(无)符号64位整数
* Keywords:
	+ keyword:用于结构化内容,例如 ID、电子邮件地址、主机名、状态代码、邮政编码或标签。
	+ constant\_keyword:始终包含相同值的关键字字段。
	+ wildcard:非结构化,机器生成的长数据
* date:日期,可使用format自定义
* Range:
	+ integer\_range:32位有字符整数,-231 ~ 231-1
	+ long\_range:64位有符号整数
	+ double\_range:64位IEEE754类型浮点数
	+ date\_range:日期,可以使用format自定义格式
	+ ip\_range:ipv4和ipv6均支持
* Text:
	+ text:全文,一般是会进行分析和分析,邮件正文,商品描述等
	+ match\_only\_text:空间优化,禁用评分,适合日志消息。


### 文档(document)


* \_index:文档存放在的索引
* \_type:文档表示的对象类别,之前与关系型数据库的table对应,现在不再强调这个
* \_id:文档唯一标识
* \_version:版本,更新文档时,该字段会改变
* \_source:数据


### 领域特定语言 (DSL)


使用 JSON 构造了一个请求。包含了filter range过滤器。


#### 分词器


在全文检索情况下,对text等类型分词,方便建立倒排索引。常见的分词器有


* ik分词器
* icu分词器
* smartcn分词器
* pinyin分词器  
 更多分词器见参考,es官方github上有一些。腾讯云可支持大部分插件,点击ES集群->插件列表。如下图所示。  
 ![](https://img-blog.csdnimg.cn/44d09495a1e441acaccf6ec7b17cb625.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbGFkeV9raWxsZXI5,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)


#### 得分排序


按照相关性得分排序,一般使用TF-IDF算法(见参考,本文主要还是在ES实践方面,算法不赘述),通过\_score返回得分


### 后台执行的操作


* 分配文档到不同的容器 或 **分片** 中,文档可以储存在一个或多个节点中
* 按集群节点来**均衡**分配这些分片,从而对索引和搜索过程进行负载均衡
* 复制每个分片以支持**数据冗余**,从而防止硬件故障导致的数据丢失
* 将集群中任一节点的请求**路由**到存有相关数据的节点
* 集群**扩容**时无缝整合新节点,重新分配分片以便从离群节点恢复


## 深入搜索(实践)


ES,you know, for search, 搜索才是重点!!!


### 数据添加


索引heros,字段及类型如下:


* name:keyword
* age:byte
* role:keyword
* birthday:date
* mail:text
* hobby:text
* sentence:text  
 数据如下:




| name | age | role | birthday | mail | hobby | sentence |
| --- | --- | --- | --- | --- | --- | --- |
| 大乔 | 18 | 辅助 | 2003-11-10 | daqiao@163.com | 写诗 画画 | 诗是自由的载体 |
| 小乔 | 19 | 法师 | 2002-01-20 | xiaoqiao@sina.com | 画画 唱歌 | Whenever you need me, I’ll be here. |
| 孙策 | 25 | 坦克 | 1996-11-10 | sunce@163.com | 画画 唱歌 | 我向往诗和远方,也不会忘记她和故乡 |
| 周瑜 | 23 | 法师 | 1998-01-20 | zhouyu@sina.com | 写诗 画画 | Whenever you are in trouble,I’m always near. |
| 刘备 | 30 | 打野 | 1991-10-20 | liubei@qq.com | 兵法 武器 | Shi wo bu tai dong |
| 孙尚香 | 26 | 射手 | 1995-10-20 |  | 兵法 化妆 | 詩我不太懂 |


#### 创建索引及文档



PUT /heros


这里使用的Kibana的DevTools,如果你看了ES系列第一篇文章,有白嫖腾讯云的ES集群,可以点击可视化配置,给Kibana配置公网白名单即可,由于我前面的文章还没有介绍Kibana的使用,你可以继续使用Postman、curl或elasticsearch-head插件来发起请求。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/0cfbdb8bfd7e4799877dcce1d22d535c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbGFkeV9raWxsZXI5,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)  
 查看setting和mapping情况



GET /heros?pretty


![在这里插入图片描述](https://img-blog.csdnimg.cn/294e84e776484dc38f47044c3f533546.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbGFkeV9raWxsZXI5,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)  
 添加一个文档



POST /heros/_doc/1001
{
“name”:“大乔”,
“age”:18,
“role”:“辅助”,
“birthday”:“2003-11-10”,
“mail”:“daqiao@163.com”,
“hobby”:“写诗 画画”,
“sentence”:“诗是自由的载体”
}


结果如下  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/347bae48180e45238da5197b2daaba7b.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbGFkeV9raWxsZXI5,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)  
 再次查询mapping  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/1d5650d50e674a6d9a33def2723ce9e4.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbGFkeV9raWxsZXI5,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)  
 可以看到ES自动添加了类型,但是与我们要求的不符合。有些不会自动分词,无法进行后序的搜索。  
 删除索引,再次添加



PUT /heros
{
“settings”: {
“number_of_shards”: 1,
“number_of_replicas”: 1
},
“mappings”: {
“properties”: {
“name”:{
“type”: “keyword”
},
“age”:{
“type”: “byte”
},
“role”:{
“type”: “keyword”
},
“mail”:{
“type”:“text”
},
“birthday”:{
“type”:“date”
},
“hobby”:{
“type”: “text”
},
“sentence”:{
“type”:“text”
}
}
}
}


![在这里插入图片描述](https://img-blog.csdnimg.cn/8791eb1055ee4ca99fbd37d7351b238e.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbGFkeV9raWxsZXI5,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)  
 之后添加文档,其他英雄的放在附录了,最终的索引应该如下图所示:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/688c9a80129d48c7aea0953845d2609f.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbGFkeV9raWxsZXI5,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)


### 结构化搜索


结构化搜索(Structured search) 是指有关探询那些具有内在结构数据的过程。比如日期、时间和数字都是结构化的:它们有精确的格式,我们可以对这些格式进行逻辑操作。  
 在结构化查询中,要么存于集合之中,要么存在集合之外。结构化查询**不关心文件的相关度或评分**;它简单的对文档包括或排除处理。


#### 单一过滤器(term)


我们首先来看最为常用的 term 查询, 可以用它处理数字(numbers)、布尔值(Booleans)、日期(date)等。  
 **注意:ES5.0后,已经没有string类型了**  
 **警告**:尽量不要用于text类型字段


**查询角色是“法师”的英雄**



GET /heros/_search
{
“query”:{
“term”:{
“role”:“法师”
}
}
}


结果如下图所示  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/ec7c59df59e14c78b83263f54d963ec2.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbGFkeV9raWxsZXI5,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)  
 **多个精确值terms**


**查询角色是“法师”或“射手”的英雄**



GET /heros/_search
{
“query”:{
“terms”:{
“role”:[“法师”,“射手”]
}
}
}


结果如图所示  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/926a03e27ebd41e5b6617815f800bb5f.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbGFkeV9raWxsZXI5,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)  
 可以看到,多了射手角色的英雄。


#### 范围过滤器(range)



{
“range”:{
“field_name”:{
},
}
}


对字段进行范围过滤,常用的如下


* gt: > 大于(greater than)
* lt: < 小于(less than)
* gte: >= 大于或等于(greater than or equal to)
* lte: <= 小于或等于(less than or equal to)


**查询19<=age<25的英雄**



GET /heros/_search
{
“query”: {
“range”:{
“age”:{
“gte”:19,
“lt”:25
}
}
}
}


结果如下图所示  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/b7f3bf5caf5e4d10be59470b7ee7b75d.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbGFkeV9raWxsZXI5,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)


#### 组合过滤器(bool过滤器)


将多个过滤器进行组组合



{
“bool” : {
“must” : [],
“must_not” : [],
“should” : [],
“filter”:[],
}
}


* must:所有语句必须匹配,相当于and
* must\_not:所有语句不能匹配,相当于not
* should:至少有一个语句匹配,相当于or


**查询角色是法师或辅助,年龄必须小于20,邮箱不能是新浪邮箱的英雄**



GET /heros/_search
{
“query”: {
“bool”: {
“must”: {
“range”:{
“age”:{
“lt”:20
}
}
},
“must_not”:
{
“match”:{“mail”:“@sina.com”}
},
“should”: [
{
“term”: {“role”: “法师”}
},
{
“term”:{“role”:“辅助”}
}
]
}
}
}


看前面的数据可以发现,就剩大乔了,结果如下图所示  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/48681f30f4bc4772ad3869ecb8f89756.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbGFkeV9raWxsZXI5,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)


#### NULL值处理(exists)


**查询有邮箱的英雄**



GET /heros/_search
{
“query”: {
“exists”: {
“field”: “mail”
}
}
}


结果如下图所示  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/77fb802fc2fa42bc80cb0f14b66ce4b7.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbGFkeV9raWxsZXI5,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)  
 那么,如何查询不存在邮箱的英雄呢?之前有missing,现在不支持了,可以使用must\_not进行嵌套



GET /heros/_search
{
“query”: {
“bool”: {
“must_not”: {
“exists”:{
“field”: “mail”
}
}
}
}
}


结果如下图所示  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/8214cdc421384db7bdce01d8d1672339.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbGFkeV9raWxsZXI5,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)


### 全文搜索


#### 基于词项与基于全文


如 term 或 fuzzy 这样的底层查询**不需要分析**阶段,它们对单个词项进行操作。  
 像 match 或 query\_string 这样的查询是高层查询,它们了解字段映射的信息


#### 匹配搜索(match)与操作符(operator)


**查询sentence中含诗的英雄**



GET /heros/_search
{
“query”: {
“match”: {
“sentence”: “诗”
}
}
}


结果如下图所示  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/c140e8e289bf4aecac816c678c0e65df.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbGFkeV9raWxsZXI5,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)  
 可以看到,评分语句更短的评分更高  
 **多词搜索**情况下  
 **查询sentence中含“我 诗”的英雄**



GET /heros/_search
{
“query”: {
“match”: {
“sentence”: “我 诗”
}
}
}


结果如下图所示  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/bac0ecd5370648cfb5167711bdd9329d.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbGFkeV9raWxsZXI5,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)  
 可以看到有些只包含我或诗的内容也出来了,虽然排名落后,如何做到**且**呢,前面使用了must,这里使用operator实现



GET /heros/_search
{
“query”: {
“match”: {
“sentence”: {
“query”: “我 诗”,
“operator”: “and”
}
}
}
}


结果如下图所示  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/684b05f7206c4534a39b8de5510cdf4b.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbGFkeV9raWxsZXI5,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)


#### 权重提升(boost)


**查询sentence中必须包含"Whenever",有"in"或者"be"的英雄**



GET /heros/_search
{
“query”: {
“bool”: {
“must”: [
{“match”: {
“sentence”: “Whenever”
}}
],
“should”: [
{ “match”: { “sentence”: “in” }
},
{ “match”: { “sentence”: “be” }}
]
}
}
}


结果如下图所示  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/f40aca1c290546869464ddff4ab2c037.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbGFkeV9raWxsZXI5,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)  
 现要求**含in的权重更高**,也就是提高\_score来提高搜索排名  
 boost默认为1,通过增加in的boost来提高in的排名



GET /heros/_search
{
“query”: {
“bool”: {
“must”: [
{“match”: {
“sentence”: “Whenever”
}}
],
“should”: [
{ “match”: {
“sentence”: {
“query”: “in”,
“boost”: 2
}
}
},
{ “match”: { “sentence”: “be” }}
]
}
}
}


结果如下图所示  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/893053feb2a0446f9d8fbc4328cec776.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbGFkeV9raWxsZXI5,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)


### 多字段搜索


前面已经进行了简单的多字符串搜索,不过,还有一些多字段时复杂的搜索情况。


#### 最佳字段查询(dis\_max与tie\_breaker)


**查询爱好有诗,sentence(随便起的名字,可以理解为个性签名或一句话介绍)中有诗或她的英雄**



GET /heros/_search
{
“query”: {
“bool”: {
“should”: [
{ “match”: { “hobby”: “诗” }},
{ “match”: { “sentence”: “诗 她” }}
]
}
}
}


结果如下图所示  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/fadabd2e3bae4e86b77fbc23cc5c396d.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbGFkeV9raWxsZXI5,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)  
 可以看到,第二个结果是我们更想得到的。bool会打两次分,再除以语句总数2,第一个结果hobby和sentence都有诗,导致第一个结果就靠前了,由于hobby和sentence的竞争关系,所以需要找到最佳匹配字段。  
 使用dis\_max来得到想要的结果



GET /heros/_search
{
“query”: {

给大家的福利

零基础入门

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

同时每个成长路线对应的板块都有配套的视频提供:

在这里插入图片描述

因篇幅有限,仅展示部分资料

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

ET /heros/_search
{
“query”: {

给大家的福利

零基础入门

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

同时每个成长路线对应的板块都有配套的视频提供:

在这里插入图片描述

因篇幅有限,仅展示部分资料

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值