通过一张图去了解elasticsearch的search过程(es源码)

撸源码过程中发现流程太长,看后面忘前面所以就把过程整理成了一张图,建议下载下图片来看

每个横向的泳道是es的不同模块

actionmodule是注册action的模块这个是es启动的时候做的不在主流程里面

粗体字是类,如果有多行下面是相关父类和接口

非粗体是相关方法,一个类中多个方法从上到下调用


下面是相关笔记

ActionModule中register了每个rest请求的Action

每个action实现了BaseRestHandler抽象类,里面主要的方法是handleRequest和prepareRequest,用户去实现prepareRequest方法返回RestChannelConsumer 去execute the action

每个prepareRequest中调用client的方法去处理request, request请求过来都经过handler然后交给client去处理,得到一个channel?这个地方调用了client中NodeClient,NodeClient实现了AbstractClient,里面有client的各种操作,execute, search , index等等

search模块中调用execute方法,execute中调用NodeClient doExecute方法,doExecute执行 executeLocally, executeLocally交给transportAction方法去执行,里面通过action得到transportAction?,然后调用transportAction execute方法

execute中交给了实现类TransportSearchAction 的doExecute方法去执行, 然后交给不同的SearchAsyncAction去做

SearchAsyncAction start之后先performFirstPhase然后注册监听进去, 得到结果之后onFirstPhaseResult,调用innerMoveToSecondPhase 去fetch即可

performFirstPhase中交给去searchTransportService去query,到这里action的事情完了,交给SearchTransportService了

SearchTransportService中是各种execute,然后交给TransportService(这个类很强大)实例sendRequest去

sendRequest交给asyncSender处理(这样做的意义?)然后交给本类的sendRequestInternal处理,然后里面交给这个类里面的sendLocalRequest和transport.sendRequest

TransportService中会register几个handler去处理不同的request,在registerRequestHandler方法中,SearchTransportService调用了register方法, sendLocalRequest中开始得handler去了,!!!这个地方设计很巧妙,可以在SearchTransportService的handler中看到具体是哪个searchService去执行的,但单独线程去执行的代码都在TransportService中,通过回调得到数据去,赞!

sendLocalRequest中声明了一个channel,在RequestHandlerRegistry中把result给到了这个channel的sendResponse中

进入到searchService中,会发现上面的不同的请求(qaf, qtf dfs)都交给这个类处理了,现在看的是executeFetchPhase,里面SearchContext(DefaultSearchContext)掌握了上下文信息结果也存在这个里面queryResult,SearchOperationListener会在search不同的执行时间进行操作监听,listener对象在INdexShard中创建的ShardSearchStats然后MeanMetric数据, 根据listener可以看出来loadOrExecuteQueryPhase是执行query的地方

进去看到QueryPhase类的execute方法是主要的lucene地方,执行方法是searcher.search(query, collector); 会把结果放在collector里面,然后queryResult.topDocs(topDocsCallable.call(), sortValueFormats); 把结果放在searchContext.queryResult中, 回到SearchService交给fetchPhase去做

fetchPhase execute中context.searcher().getIndexReader().leaves().get(readerIndex);得到id,然后通过StoredFieldVisitor的实现类FieldsVisitor得到原始数据,这说明,原始数据还是lucene做的

bind方法类似spring的IOC,把类注入,其他地方用的时候会自动加载

每个action的初始化函数里面controller.registerHandler就是告诉哪些请求会采用这个action处理

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

推荐阅读更多精彩内容