专栏名称: 京东成都研究院
京东商城成都研究院信息平台
目录
相关文章推荐
清廉蓉城  ·  李希在江西调研时强调 ... ·  20 小时前  
成都发布  ·  成都直飞!国际航线上新 ·  21 小时前  
51好读  ›  专栏  ›  京东成都研究院

Elaticsearch原理浅析

京东成都研究院  · 公众号  · 成都  · 2018-06-20 17:01

正文

简介


Elasticsearch (ES)是一个基于Lucene的搜索服务器。其基于RESTful API接口,使用Java开发,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。它不但稳定、可靠、快速,而且也具有良好的水平扩展能力,是专门为分布式环境设计的。

核心概念

1、集群

包含多个节点,每个节点属于哪个集群是通过一个配置(集群名称,默认elasticsearch)来决定的。

2、节点

集群中的一个节点,节点也有一个名称(默认是随机分配的),节点名称很重要(在执行运维管理操作的时候),默认节点会去加入一个名称为“elasticsearch”的集群,如果直接启动一堆节点,那么它们会自动组成一个elasticsearch集群,当然一个节点也可以组成一个elasticsearch集群。

3、文档

Elasticsearch中的最小数据单元,一个document可以是一条客户数据,一条商品分类数据,一条订单数据,通常用JSON数据结构表示,每个index下的type中,都可以去存储多个document。一个document里面有多个field,每个field就是一个数据字段。

4、索引(Index)

包含一堆有相似结构的文档数据。一个index包含很多document,一个index就代表了一类类似的或者相同的document。比如说建立一个product index,商品索引,里面可能就存放了所有的商品数据(各种类型Type的数据),所有的商品document。

5、类型(Type)

每个索引里都可以有一个或多个type,type是index中的一个逻辑数据分类,一个type下的document,都有相同的field,比如博客系统,有一个索引,可以定义用户数据type,博客数据type,评论数据type。

6、主分片

单台机器无法存储大量数据,es可以将一个索引中的数据切分为多个shard,分布在多台服务器上存储。有了shard就可以横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,提升吞吐量和性能。

7、副本分片

任何一个服务器随时可能故障或宕机,此时shard可能就会丢失,因此可以为每个shard创建多个replica副本。replica可以在shard故障时提供备用服务,保证数据不丢失,多个replica还可以提升搜索操作的吞吐量和性能。


倒排索引

01

单词——文档矩阵

单词-文档矩阵是表达两者之间所具有的一种包含关系的概念模型,图每列代表一个文档,每行代表一个单词,打对勾的位置代表包含关系。搜索引擎的索引其实就是实现“单词-文档矩阵”的具体数据结构, “倒排索引”是实现单词到文档映射关系的最佳实现方式,如下图:

02

倒排索引

也常被称为反向索引,或反向档案,是一种索引方法,用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射,它是文档检索系统中最常用的数据结构。倒排索引分为如下步骤:

1.需要索引的文档

2.将原件传给分词组件,比如常见的IK,分词组件(Tokenizer)会做以下几件事情( 此过程称为Tokenize) ,最终得到词元(Token):

Ø  将文档分成一个一个单独的单词

Ø  去除标点符号

Ø  去除停词(Stop word)

3.将得到的词元(Token)传给语言处理组件(Linguistic Processor),语言处理组件(linguistic processor)主要是对得到的词元(Token)做一些同语言相关的处理:

Ø  变为小写(Lowercase)

Ø  将单词缩减为词根形式,如“cars ”到“car ”等。这种操作称为:stemming

Ø  将单词转变为词根形式,如“drove ”到“drive ”等。这种操作称为:lemmatization

4.将得到的词(Term)传给索引组件(Indexer),索引 组件(Indexer)主要做以下几件事情:

Ø  利用得到的词(Term)创建一个字典

Ø  对字典按字母顺序进行排序

Ø  合并相同的词(Term) 成为文档倒排(Posting List) 链表

5.最终生成倒排文件,流程如下图:


文档CRUD原理

01

创建新文档

1.客户端发送一个创建索引请求,协调节点根据路由算法  shard=hash(_id)%number_of_primary_shards,计算出新文档应该加入到哪个分片(shard)中。而每个节点都存储有每个分片存储在哪个节点的信息,因此协调节点会将请求发送给对应的节点。这个请求首先会发送给主分片,等主分片完成索引,会并行将请求发送到其所有副本分片,保证每个分片都持有最新数据。

2.新文档首先写入内存缓冲区中,并将这一操作写入一个translog文件中,当前这个文档无法被搜索到。

3.Elasticsearch会每隔1秒时间进行一次刷新操作(refresh),此时在这1秒时间内写入内存的新文档都会被写入一个文件系统缓存(filesystem cache)中,并构成一个分段(segment)。此时这个segment里的文档可以被 搜索到,但是尚未写入硬盘,即如果此时发生断电,则这些文档可能会丢失。

4.每隔30分钟或者translog文件变得很大,则执行一次fsync操作,此时所有在文件系统缓存中的segment将被写入磁盘,而translog将被删除(此后会生成新的translog),这个过程在Elasticsearch中称为冲洗(flush)。大致流程如下:

5.由于translog本身也是文件,存在于内存当中,如果发生断电一样会丢失。因此,Elasticsearch会在每隔5秒时间或是一次写入请求完成后将translog写入磁盘。

6.由于产生的分段segment文件越来越多,当对一个分片进行查询请求时,将会轮流查询分片中的所有segment,这样效率会很低下。于是Elasticsearch会启动一个后台线程,将一部分相似大小的segment合并成一个新的大segment,当新segment被写入磁盘,所有被合并的旧segment被清除。

02







请到「今天看啥」查看全文