ElasticSearch简介
Elaticsearch, 是一款大数据场景下的分布式全文搜索引擎,是建立在全文搜索引擎 Apache Lucene基础上的搜索引擎。
ElasticSearch基本原理
1.index 索引
索引是具有相似特征的文档的集合,类似于关系数据库中mysql的索引 ,包括:配置信息mapping和倒排索引数据文件。
一个索引的数据文件可能会分布于一台机器,也有可能分布于多台机器。
2.type 类型
type:表示一类相似的文档,作为一个元数据来实现逻辑划分,类比传统的关系型数据库领域来说,类型相当于“表”。
3.document 文档
document:是在ElasticSearch中可以被索引的基本单位,以JSON表示,类似于关系数据库中的一行。
4.Field 字段
Field是Elasticsearch的最小单位,一个document里面有多个field,这个与MySQL表中的字段类似的作用。
5.shard 分片
单台机器无法存储大量数据,为了支持更大量的数据,ElasticSearch可以将一个索引中的数据切分为多个shard分片。
ElasticSearch的分片(shard)机制:将一个索引内部的数据分布地存储于多个节点。
将一个索引切分为多个底层物理的 Lucene 索引,完成索引数据的分割存储功能,这每一个物理的 Lucene 索引称为一个分片(shard)。
分片有两种:
- 主分片(Primary Shard);
- 副本分片(Replica Shard);
有了shard分片就可以横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,从而提升吞吐量和性能。
6.replica副本
任何一个服务器随时可能故障或宕机,此时 shard 分片可能会丢失,因此可以为每个shard 需要创建多个 replica 副本。
副本就是对分片的 Copy,每个主分片都有一个或多个副本分片,当主分片异常时,副本可以提供数据的查询等操作,保证数据不丢失。
ElasticSearch工作原理
1.分词
搜索是以词为单位做最基本单位的搜索单元,依赖分词器构建分词,用分词器倒排索引。
ElasticSearch的分词器Analyzer一般由三种组件构成:
1)character filter 字符过滤器
在一段文本分词之前,先进行预处理,比如说最常见的就是 过滤html标签。
比如:
<div> <span>mikechen的互联网架构<span> </div>
如果想获取其中文本:mikechen的互联网架构,你首先需要过滤的就是html标签,这就是字符过滤器。
2)tokenizers 分词器
默认情况下,英文分词根据空格将单词分开,中文分词按单字隔开,也可以采用机器学习算法来分词。
比如:mikechen的互联网架构,这个就是需要涉及到分词器,根据英文和中文来分词,所以这里就会涉及到具体的分词器。
比如:ElasticSearch 有下面这些内置的分词器:
- Standard Analyzer:默认分词器,按词切分,转小写处理,可以过滤停用词(默认关闭);
- Simple Analyzer:按照非字母切分,非字母会被去除,转小写处理;
- Stop Analyzer:按照非字母切分,非字母会被去除,转小写处理,停用词过滤(the、a、is 等);
- Whitespace Analyzer:按照空格切分,不转小写;
- Keyword Analyzer:不做任何的分词处理,直接将输入当作输出;
- Pattern Analyzer:通过正则表达式进行分词;
- Language Analyzers:提供了30多种常见语言的分词器,比如:english英语分词器等。
3)Token filters 过滤器
对切分好的单词进一步加工,比如大小写转换,删除停用词等。
2.倒排索引
倒排索引是搜索引擎的核心,搜索引擎的主要目标是在查找发生搜索条件的文档时提供快速搜索。
倒排索引是一种像数据结构一样的散列图,可将用户从单词导向文档或网页,它是搜索引擎的核心,其主要目标是快速搜索从数百万文件中查找数据。
倒排索引是区别于正排索引的概念:
正排索引:是以文档对象的唯一 ID 作为索引,以文档内容作为记录。
倒排索引:Inverted index,指的是将文档内容中的单词作为索引,将包含该词的文档 ID 作为记录。
3.ElasticSearch的搜索流程
搜索被执行成一个两阶段过程:
第一个阶段:Query阶段
主要分为如下3个步骤:
- 客户端发送请求到 coordinate node,协调节点将搜索请求广播到所有的 primary shard 或 replica;
- 每个分片在本地执行搜索,并构建一个匹配文档的大小为 from + size 的优先队列;
- 接着每个分片返回各自优先队列中 所有 docId 和 打分值 给协调节点,由协调节点进行数据的合并、排序、分页等操作,产出最终结果。
第二个阶段:Fetch阶段
协调节点根据 Query阶段产生的结果,去各个节点上查询 docId 实际的 document 内容,最后由协调节点返回结果给客户端。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》