距离上一次更新该文章已经过了 654 天,文章所描述的內容可能已经发生变化,请留意。
es分享
一. 建立倒排索引
认识
倒排索引是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射
plaintext
1 | 1问: 说出带"前"字的古诗词 |

plaintext
1 | 4问: 具象化到关系库模型也就是如下 |

plaintext
1 | 5问: 在脑子中形成的索引是这样的 |

plaintext
1 | 6问: 在脑子里建立了name的索引, 关系库的表现方式就变成了如下 |

plaintext
1 | 8问: 上面所说索引建立模式解决了寻找慢的问题,那么新的问题来了, |

plaintext
1 | 11问: 多首诗的可以这样 |

如上就是倒排索引的一个入门讲解
补充:
- ES 默认会对全部字段进行索引,如上面的古诗表,name也可以是个索引,author也可以是个索引
- 倒排索引的概念源自搜索引擎,最开始在lucene中被广泛认知和使用,而es则是在lucene的基础之上进行了包装和使用
二. 倒排索引的入门讲解完事儿,再来细究下这个倒排索引究竟啥样的,怎么存储的
- es内部结构前置概念
term
plaintext
1 | 如上面的古诗事例中,key所代表的就是一个term |
postings list
plaintext
1 | 还是用上面的例子,{静夜思, 望庐山瀑布}是 "前" 这个 term 所对应列表。 |

Term Dictionary
plaintext
1 | 理解成一本新华字典,存上述所有term的新华字典 |
问题来了.Term Dictionary 存在哪?硬盘?io效率太慢了.肯定内存更合适
但是如果term太多,term dictionary也会很大,上面也说到了,es会对所有字段默认建立索引,直接存放在内存不现实,于是有了Term Index
Term Index
plaintext
1 | 就像字典里的索引页一样,A开头的有哪些term,分别在哪页,可以理解term index是一颗树: |
三. 使用,结合生产讲使用
- es就是一个分布式存储的搜索和分析引擎
- es对外提供了一堆api,所有api都玩明白了,就相当于"会用"es了
- 如下是es7之后数据类型支持

- es和mysql的概念对比(type在8.0中将完全删除,目前处于待舍弃状态)

ES支持两种基本方式检索;query dsl 和rest
以生产日志告警举例
json1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27# 查询过去10分钟的错误日志
es:(querydsl语法)
GET prod-sopei-20211007/_search
{
"size": 100,
"query": {
"bool": {
"must": [
{
"range": {
"@timestamp": {
"gte": "now-10m",
"lte": "now"
}
}
},
{
"match": {
"logtype.keyword": "error"
}
}
]
}
}
}
mysql:
`select * from prod-sopei-20211007 where @timestamp > DATE_SUB(NOW(),INTERVAL 10 MINUTE)and logtype = "error" limit 100`其他的增删改查由于es的内容很多,这里不一一概述
四. 优化
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 小五的个人杂货铺!