SolrCore2 9 1原始碼分析備忘

2021-09-23 20:58:16 字數 3351 閱讀 6128

** 下面的分析有點散,圍繞solrcore展開,重點是query流程,細入是getsearcher

內容中有一些直接從參考鏈結裡面拷貝的。

solrcore功能點

0.jmx的初始化—》遠端監控使用

進入參考鏈結

預設情況下不會起到jmx

配置資訊----》整個檢索層的配置

commit的時候會getsearcher從而開啟新的reader檢視,solrindexsearcher之後就可見。

查詢解析的qquerparse、高亮、searchcomponent、【讀reader共享、寫需要同步reader,solrindexsearch開啟的都是readonlyreader

執行緒安全並且單例,提公升效能】

事件支援:firstsearcherlisteners、newsearcherlisteners

這裡可以作為擴充套件自己的reader服務的入口

查詢返回的responsewriter

,間接關聯reader管理,

索引的刪除策略載入

execute分析

在solrcore中有兩個execute方法:

1.execute(solrqueryrequest req, solrqueryresponse rsp)

2.execute(solrrequesthandler handler, solrqueryrequest req,

solrqueryresponse rsp)

對於第乙個方法,沒有像第二個方法那樣的handler引數,但是其實其內部通過這樣乙個方法來獲得handler

的:solrrequesthandler

handler = getrequesthandler(req.getquerytype())。也就是說我們通過在req中指定qt引數的值就可以獲得我們想要的處理

器,當然這些處理器需要在solrconfig.xml的

requesthandler元素中定義(配置檔案中有大量requesthandler)。這樣伺服器在建立時才能建立相應的處理器例項。

這裡我發現在獲取處理器時,引數為"",null還是standard都能得到standardrequesthandler的例項

solrcore::execute的流程

1.進行handler合法性的檢查,不能為null,否則丟擲錯誤。

2.final namedlistresponseheader = new

******orderedmap();

rsp.add("responseheader", responseheader);

建立乙個單序對映表並將其作為響應頭加入到rsp中。

3.namedlist tolog = rsp.gettolog();

4.handler.handlerequest(req,rsp);

5.stringbuilder sb = new

stringbuilder();....

從rsp的tolog中獲得資訊並將其加入到sb中,然後在日誌中輸出。

分析了solrcore中的execute方法的流程,而且可以看到具體執行查詢過程的語句是:handler.handlerequest(req,rsp)。請注意查詢時候,這裡的變數的型別是:

handler:standardrequesthandler

req:solrrequestparsers類中的乙個匿名類。

rsp:solrqueryresponse

query呼叫流

standardrequesthandler extends

searchhandler,solrcore::execute.handler.handlerrequest(),

轉為solrcore::execute.standardrequesthandler.handlerrequest

而searchhandler extends

requesthandlerbase

真正執行handlerrequest()

在requesthandlerbase.handlerrequest()中

設定httpcaching、handlerequestbody(),

抽象的handlerrequestbody()在子類searchhandler中實現了,

執行prepare、process

通過solrconfig.xml中配置獲取。

solrcore 中 searcher

control部分有點複雜

----getsearcher的邏輯

getsearcher – (forcenew,

returnsearcher, waitsearcher-futures)

關注solr全域性三個點呼叫getsearcher函式

: solrcore初始化時(false, false, null),querycomponent處理查詢請求時(false, true, null),updatehandler在處理commit請求時(true, false, new future[1])

外部呼叫

之前,從core中getrequesthandler,_parser中buildrequestfrom(), new solrqueryresponse()

返回solrqueryrequestbase,

protected

refcounted

searcherholder;

publicsolrindexsearcher getsearcher()

returnsearcherholder

.get();

publicvoid

close()

引用物件

引用物件的典型使用是solrcore,看下相關**:

也就是說corecontainer顯示的open了solrcore,所以在得到solrcore例項後,也需要顯示的close它。因為solrqueryrequestbase用到了solrcore,所以在處理請求的最後,要確保呼叫了solrcore的close方法。當然,對於查 詢端,solrcore例項在整個生命週期內通常並不會真正被close,除非顯示的呼叫了reload等操作。

Cartographer原始碼篇 原始碼分析 1

在安裝編譯cartographer 1.0.0的時候,我們可以看到 主要包括cartorgarpher ros cartographer ceres sover三個部分。其中,ceres solver用於非線性優化,求解最小二乘問題 cartographer ros為ros平台的封裝,獲取感測器資料...

AbstractListView原始碼分析3

normal list that does not indicate choices public static final int choice mode none 0 the list allows up to one choice public static final int choice ...

Android AsyncTask原始碼分析

android中只能在主線程中進行ui操作,如果是其它子執行緒,需要借助非同步訊息處理機制handler。除此之外,還有個非常方便的asynctask類,這個類內部封裝了handler和執行緒池。本文先簡要介紹asynctask的用法,然後分析具體實現。asynctask是乙個抽象類,我們需要建立子...