Elasticsearch搜索过程解析

1.对已知文档的搜索

如果被搜索的文档(不论是单个文档,还是批量文档)能够从主分片或任意一个副本分片中被检索到,则与索引文档过程相同,对已知文档的搜索也会用到路由算法,Elasticsearch 中的路由算法如下所示:
Shard = hash(routing) % number_of_primary_shards

2.对未知文档的搜索

除了对已知文档的搜索外,大部分请求实际上是不知道查询条件会命中哪些文档的。这些被查询条件命中的文档可能位于 Elasticsearch 集群中的任意位置上。因此,搜索请求的执行不得不去查询每个索引中的每一个分片。

在 Elasticsearch 中,搜索过程分为查询阶段(Query Pahse)和获取阶段(Fetch Phase)。
在查询阶段,查询请求会广播到索引中的每一个主分片和备份中,每一个分片都会在本地执行检索,并在本地各建立一个优先级队列(Priority Queue)。该优先级队列是一份根据文档相关度指标进行排序的列表,列表的长度由 from 和 size 两个分页参数决定。
查询阶段可以再细分成3个小的子阶段:
(1)客户端发送一个检索请求给某个节点A,此时节点A会创建一个空的优先级队列,并配置好分页参数from与size。
(2)节点A将搜索请求发送给该索引中的每一个分片,每个分片在本地执行检索,并将结果添加到本地优先级队列中。
(3)每个分片返回本地优先级序列中所记录的ID与sort值,并发送给节点A。节点A将这些值合并到自己的本地优先级队列中,并做出全局的排序。
在获取阶段,主要是基于上一阶段找到所要搜索文档的具体位置,将文档数据内容取回并返回给客户端。

在Elasticsearch中,默认的搜索类型就是上面介绍的Query then Fetch。上述描述运作方式就是Query then Fetch。Query then Fetch有可能会出现打分偏离的情形,幸好,Elasticsearch还提供了一个称为"DFS Query then Fetch"的搜索方式,它和Query then Fetch基本相同,但是它会执行一个查询来计算整体文档的frequency。其处理过程如下所示:
(1)预查询每个分片,询问Term和Document Frequency等信息。
(2)发送查询请求到每个分片。
(3)找到各个分片中所有匹配的文档,并使用全局的Term/Document Frequency信息进行打分。在执行过程中依然需要对结果构建一个优先队列,如排序等。
(4)返回关于结果的元数据到请求节点。需要指出的是,此时实际文档还没有发送到请求节点,发送的只是分数。
(5)请求节点将来自所有分片的分数合并起来,并在请求节点上进行排序,文档被按照查询要求进行选择。最终,实际文档从它们各自所在的独立的分片上被检索出来,结果被返回给读者。

3.对词条的搜索

具体到一个分片,ELasticsearch是如何按照词条进行进行搜索的呢?
当词条数量较少时,我们可以顺序遍历词条获取结果,但如果词条有成千上万个时,Elasticsearch为了能快速找到某个词条,它对所有的词条都进行了排序,随后使用二分法查找词条,其查找效率为log(N)。这个过程就像查字典一样,因此排序词条的集合也称为Term Dictionary。
为了提高查询性能,Elasticsearch直接通过内存查找词条,而非从磁盘中读取。但当词条太多时,显然Term Dictionary也会很大,此时全部放在内存有些不现实,于是引入了Term Index。
Term Index就像字典中的索引页,其中的内容如字母A开头的有哪些词条,这些词条分别在哪页。通过Term Index,Elasticsearch也可以快速定位到Term Dictionary的某个OffSet(位置偏移),然后从这个位置再往后顺序查找。
前面提及了单个词条的搜索方法,而在实际应用中,更常见的往往是多个词条拼接程的"联合查询"。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容