搜索|图解 ElasticSearch 原理,你可收好了!

来源:Richaaaard
哈喽,各位新来的小伙伴们,大家好!由于公众号做了改版,为了保证公众号的资源能准时推送到你手里,大家记得将咱们的公众号加星标置顶,在此真诚的表示感谢~
正文如下:
Elasticsearch 是一款功能强大的开源分布式搜索与数据分析引擎,目前国内诸多互联网大厂都在使用,包括携程、滴滴、今日头条、饿了么、360 安全、小米、vivo 等。
除了搜索之外,结合 Kibana、Logstash、Beats,Elastic Stack 还被广泛运用在大数据近实时分析领域,包括日志分析、指标监控、信息安全等多个领域。
它可以帮助你探索海量结构化、非结构化数据,按需创建可视化报表,对监控数据设置报警阈值,甚至通过使用机器学习技术,自动识别异常状况。
今天,我们先自上而下,后自底向上的介绍ElasticSearch的底层工作原理,并试图回答以下问题:
为什么我的搜索 *foo-bar* 无法匹配 foo-bar ?
为什么增加更多的文件会压缩索引(Index)?
为什么 ElasticSearch 占用很多内存?
# 图解 ElasticSearch
elasticsearch 版本: elasticsearch-2.2.0。
云上的集群
如下图:
搜索|图解 ElasticSearch 原理,你可收好了!
文章插图
集群里的盒子
云里面的每个白色正方形的盒子代表一个节点——Node。
搜索|图解 ElasticSearch 原理,你可收好了!
文章插图
节点之间
在一个或者多个节点直接,多个绿色小方块组合在一起形成一个 ElasticSearch 的索引。
搜索|图解 ElasticSearch 原理,你可收好了!
文章插图
索引里的小方块
在一个索引下,分布在多个节点里的绿色小方块称为分片——Shard。
搜索|图解 ElasticSearch 原理,你可收好了!
文章插图
Shard=Lucene Index
一个 ElasticSearch 的 Shard 本质上是一个 Lucene Index。
搜索|图解 ElasticSearch 原理,你可收好了!
搜索|图解 ElasticSearch 原理,你可收好了!
文章插图
Lucene 是一个 Full Text 搜索库(也有很多其他形式的搜索库),ElasticSearch 是建立在 Lucene 之上的。
接下来的故事要说的大部分内容实际上是 ElasticSearch 如何基于 Lucene 工作的。
# 图解 Lucene
Mini 索引:Segment
在 Lucene 里面有很多小的 Segment,我们可以把它们看成 Lucene 内部的 mini-index。
搜索|图解 ElasticSearch 原理,你可收好了!
文章插图
Segment 内部
搜索|图解 ElasticSearch 原理,你可收好了!
文章插图
Segment 内部有着许多数据结构,如上图:
Inverted Index
Stored Fields
Document Values
Cache
最最重要的 Inverted Index
如下图:
搜索|图解 ElasticSearch 原理,你可收好了!
文章插图
Inverted Index 主要包括两部分:
一个有序的数据字典 Dictionary(包括单词 Term 和它出现的频率)。
与单词 Term 对应的 Postings(即存在这个单词的文件)。
当我们搜索的时候,首先将搜索的内容分解,然后在字典里找到对应 Term,从而查找到与搜索相关的文件内容。
搜索|图解 ElasticSearch 原理,你可收好了!
文章插图
查询“the fury”
如下图:
搜索|图解 ElasticSearch 原理,你可收好了!
文章插图
自动补全(AutoCompletion-Prefix)
如果想要查找以字母“c”开头的字母,可以简单的通过二分查找(Binary Search)在 Inverted Index 表中找到例如“choice”、“coming”这样的词(Term)。
搜索|图解 ElasticSearch 原理,你可收好了!
文章插图
昂贵的查找
如果想要查找所有包含“our”字母的单词,那么系统会扫描整个 Inverted Index,这是非常昂贵的。
搜索|图解 ElasticSearch 原理,你可收好了!
文章插图
在此种情况下,如果想要做优化,那么我们面对的问题是如何生成合适的 Term。
问题的转化
如下图:
搜索|图解 ElasticSearch 原理,你可收好了!
文章插图
对于以上诸如此类的问题,我们可能会有几种可行的解决方案:
* suffixxiffus *,如果我们想以后缀作为搜索条件,可以为 Term 做反向处理。
(60.6384, 6.5017) u4u8gyykk,对于 GEO 位置信息,可以将它转换为 GEO Hash。
123,对于简单的数字,可以为它生成多重形式的 Term。
解决拼写错误
一个 Python 库为单词生成了一个包含错误拼写信息的树形状态机,解决拼写错误的问题。
搜索|图解 ElasticSearch 原理,你可收好了!