简单谈谈对elasticsearch的认知
elasticsearch是一个主要应用于大数据场景下的全文搜索引擎,同时扩展了丰富的统计分析功能,除了基本的统计分析外,还可以完成一些比较复杂的统计分析,如推荐系统。
附:ES系列:elasticsearch的功能及Top 5大应用场景
Elasticsearch能够实现快速搜索的原因
ES的核心是倒排索引(其他搜索引擎也类似);并且基于倒排索引,充分利用了缓存。这是可以快速搜索的主要原因。
另外对于搜索请求是分布式执行的,由多台机器同时执行,然后汇总,这也是可以快速搜索的一个主要原因。
什么是倒排索引
倒排索引是类似于哈希表一样的数据结构,完成由词条(也称为term/token)到文档id的映射。可以根据搜索词条快速找到该词条对应的所有文档id,然后根据id直接获取文档。
集群、节点、索引、文档、分片的概念
分析器
主要功能是完成需要分析的字段值到词条标准化的过程。主要由字符过滤器(0个或多个)、分词器、词条过滤器构成。
字符过滤器:主要在分词之前整理字符串,比如去掉html字符,完成&到and的转换等;
分词器:主要功能是将字符串分割成词条;
过滤器:每个词条按顺序通过词条过滤器,完成词条的标准化,如:统一为小写,增加一些同义词词条,去除无用词条等。
详细描述下索引数据的过程
协调节点默认使用文档id计算分片所在位置,然后将请求转发到相应分片;默认计算方式:
shard = hash(document_id) % (num_of_primary_shards)
分片接收到请求之后首先将数据写入到index-buffer,同时记录translog;默认情况下这个过程在主分片与副本分片都完成之后,再给客户端返回写入成功的响应。可以配置,写入大于n个分片之后就返回到客户端写入成功。
每隔一定时间就会写入到filesystem-cache(refresh过程)。
每隔一段时间或者filesystem-cache数据量到一定程度之后,就会写入到磁盘(flush)。
如果两次flush直接出现异常,可以通过translog恢复数据。
特别说明为了提高写数据性能,可以将写translog设置为异步写,但异常情况下可能会造成少量数据丢失。
描述下文档更新和删除的过程
elasticsearch是基于lunece实现的,文档是不可变的。每一个索引段都对应一个.del文件,文档被删除之后,并不影响其在索引段中的存在状态,仅仅是在.del文件中记录。在执行查询请求时,被删除的文档依旧会被搜索到,只不过在返回之前会通过.del文件将其过滤掉。
对于更新操作,也是新创建一个文档,与旧文档的区别是版本号不同。旧文档的id和版本号会被记录到.del文件中,相当于删除。
描述下文档搜索过程
搜索过程分为两个阶段,Query & Fetch
首先是协调节点将请求转发到各个分片,各个分片执行查询操作。
分片执行完查询操作后,将id和排序值(注意不是所有节点)返回给协调节点。
协调节点收到各分片的响应之后会综合排序比较,判断应该返回哪些文档,然后发送相应id到各个分片,Fetch数据。
注意:Query Then Fetch的搜索类型在文档相关性打分的时候参考的是本分片的数据,这样在文档数量较少的时候可能不够准确,但大数据下影响不大。
未完待续... ...