** 下面的分析有點散,圍繞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是乙個抽象類,我們需要建立子...