前言
之前学过很多遍ES,都没有做笔记,这次想要系统的做一次笔记。
(知识搬运工
走近 ElasticSearch (一)——基本概念与架构设计
走近 ElasticSearch (二)——Document概念、倒排索引原理与分词
走近 ElasticSearch (三)——Mapping设计与Search API 介绍
定义与起源
它是什么?
一个便于检索的数据库
更近一步呢?
基于 Lucene 的开源搜索引擎。
分布式,可拓展,每个字段都能被索引
至于起源……
一位待业极客男青年与他媳妇的故事……
使用场景
目前市场上与es相关的产品:
1、大多数的站内搜索
2、维基百科,使用ES提供全文搜索并高亮关键字
3、stackoverflow,结合全文搜索和地理位置查询
4、github,使用ES检索1300亿行的代码
5、国内的许多互联网公司
6、头条搜索,放心购、懂车帝
ES还能做什么?
NoSQL数据库
对海量数据进行近实时的处理
日志数据分析,ELK技术,ES进行复杂的数据分析
架构设计
- restful api java api:对于向ES插入数据、检索数据、删除数据等操作,ES提供了Java API和RESTful API 两种方式来与之通信。
- transport:通信模块。
- 节点间数据传输都依赖于该模块;
- 它有两种实现,一种是基于netty实现的nettytransport,主要用于节点间的通信。另一种是localtransport,主要是用于同一个jvm上的节点通信。
- discovery script:自动发现模块。
- 集群中节点的自动发现和Master节点的选举(p2p通信);
- Master节点维护集群的全局状态(比如节点加入和离开时进行shard的重新分配);
- master节点选取(bully算法);
- 故障检测:主节点->其他节点,其他节点->主节点。
- Index模块:对写入数据的管理和组织。
- Search模块:用来提供信息搜索。
- Mapping映射模块:类似于数据库表字段的定义,并且它决定了各个字段能否被搜索,以及搜索方式。
- River模块:ES的一个数据源,用于把数据从之前的数据源搬运到ES中。river data —> es
- Lucene:一个全文检索引擎框架,java类库,提供底层API,每个ES节点上都有一个Lucene引擎支持。(倒排索引)
- gateway:存储索引的文件系统,支持多种文件类型
好的架构设计,无非就是为了更好的写入(索引)和查询(搜索)
名词解释
- 集群 Cluster:由一个或多个节点组成,对外提供服务。
- 节点 Node:一个 Elasticsearch的运行实例,是集群的构成单元。
- 索引 Index:由具有相同字段的文档列表组成。相当于mysql中的database,一个集群可以有多个索引,如nginx按天
nginx-log-2020-05-01建索引。 - 类型 Type:ES6.5以后已经不使用type了。统一为_doc。相当于mysql中的table。
- 文档 Document:用户存储在 es 中的数据文档。相当于mysql中的row(一行数据)。
- 映射 Mapping:文档结构描述。分静态映射(事先定义字段的数据类型、分词器等属性)和动态映射(根据写入的字段进行类型推测)。
- 分片 Shard:一个文档默认5个分片。相当于一桶水用了N个杯子装。主分片和备分片不会出现在同一个节点上(防止单点故障)
- 段 Segment:每个分片包含多个segment,每一个segment都是一个倒排索引;在查询会把所有的segment查询结果汇总归并后作为最终的分片查询结果,然后返回。
- 倒排索引 Search:基于luence。
- 分词 Term:Mapping定义中的分词定义字段