Solr查詢過程原始碼分析

2021-05-24 23:43:02 字數 4018 閱讀 5696

searchhandler.handlerequestbody():

solr搜尋主流程

1.呼叫:requesthandlerbase

|--handlerequest(req, rsp);

2.原始碼分析:

|-prepare() |前期的請求引數準備工作,querycomponent可以在schemal檔案中設定,易擴充套件

|-- searchcomponent c : components

|--querycomponent.prepare()

|--fq,fl,shards,q.shards.rows,shards.start |設定查詢的條件,包括分片的查詢條件

|--設定fieldflags返回的field值

|--設定deftype值 |預設lucene,實際指向的是luceneplugin,可在schema檔案中擴充套件

|--解析queryparser |對querystring進行解析

|--解析fq過濾值,生成filter過濾query集

|--設定shards分片資訊

|--statcomponent.prepare()

|--debugcomponent.prepare()

|--process() |單組無shard情況處理

|--string ids = params.get(shardparams.ids); |獲取sharddoc的id集合,不為空往下執行

|--通過ids獲取文件id的集合,並為下一步獲取doclist做準備

|--int id = req.getsearcher().getfirstmatch(

|--new term(idfield.getname(), idfield.gettype().tointernal(idarr.get(i))));

|-- luceneids[docs++] = id;

|-- res.doclist = new docslice(0, docs, luceneids, null, docs, 0);

|--if (rb.isneeddocset()) 存在docset需求

|--queries.add(rb.getquery()); |querystring的查詢條件

|--queries.addall(filters); |filter查詢條件

|--res.docset = searcher.getdocset(queries); |通過queries條件進行docset查詢

|--rb.setresults(res); |設定結果返回值

|--rsp.add("response",rb.getresults().doclist);

|--return; |獲取結果集後返回

|--solrindexsearcher.querycommand cmd = rb.getquerycommand(); |獲取查詢封裝的querycommand物件

|--searcher.search(result,cmd);

|--getdoclistc(qr,cmd);

|--rb.setresult( result ); |與上同

|--rsp.add("response",rb.getresults().doclist);

|--boolean fsv = req.getparams().getbool(responsebuilder.field_sort_values,false); |設定fsv,用於排序字段處理

|--sortfield sortfields |獲取排序的域

|--field field = new field("dummy", "", field.store.yes, field.index.no); // 仿冒域

|--solrindexreader readers = reader.getleafreaders(); |獲取所有的indexreader結點

|--if (readers.length==1) subreader = readers[0]; |直接處理

|--for (sortfield sortfield: sortfields) |迴圈處理各個排序域

|--fieldcomparator comparators = (readers==null) ? null : new fieldcomparator[readers.length]; |宣告域比較器

|--dociterator it = rb.getresults().doclist.iterator(); |過濾doclist集合

|--while(it.hasnext())

|--int doc = it.nextdoc();

|--idx = solrindexreader.readerindex(doc, offsets); |獲取id所在的indexreader

|--comparator.copy(0, doc);

|--object val = comparator.value(0); |獲取comparator的value值

|-- vals.add(val); |新增至vals當中

|--sortvals.add(fieldname, vals); |新增至排序值當中

|--rsp.add("sort_values", sortvals); |設定響應物件response的sort_values的排序值

|--process() |多組shard處理

|--初始化操作

|--while (nextstage != integer.max_value) |迴圈執行,設定stage狀態

|-- for( searchcomponent c : components ) {

|--nextstage = math.min(nextstage, c.distributedprocess(rb)); |distributedprocess(rb)根據rb的stage狀態做處理

|-- while (rb.outgoing.size() > 0)

|--while (rb.outgoing.size() > 0)

|--shardrequest sreq = rb.outgoing.remove(0); |取第乙個請求值

|--for (string shard : sreq.actualshards)

|--modifiablesolrparams params = new modifiablesolrparams(sreq.params); |設定引數

|--comm.submit(sreq, shard, params); |提交http請求,執行乙個task任務,獲取response響應

|--while (rb.outgoing.size() == 0)

|--shardresponse srsp = comm.takecompletedorerror(); |獲取響應

|--rb.finished.add(srsp.getshardrequest()); |完成此次搜尋

|--for(searchcomponent c : components) |完成返回的response的處理

|--c.handleresponses(rb, srsp.getshardrequest());

|-- for(searchcomponent c : components)

|-- c.finishstage(rb); |rb請求響應完成處理

|--solrindexsearcher.getdocset(list)

|--if (queries.size()==1) return getdocset(queries.get(0)) |query集合為1則直接處理

|--for (int i=0; i

Elasticsearch查詢過程

客戶端向集群中的某個節點 假設節點1 發起查詢請求,節點1會建立乙個from size大小的佇列 from 偏移量,size 要取回的文件個數 節點1向集群中所有其他的分片 主或從 發起查詢請求,每個分片也會建立乙個from size大小的佇列,並將查詢結果新增到佇列中。其他分片將查詢到的文件id和...

屬性查詢過程

import numbers class intfield 資料屬性描述符 實現了get和set def get self,instance,owner return self.value def set self,instance,value if not isinstance value,num...

DNS查詢過程

dns domain name system 將網域名稱和ip位址相互對映的乙個分布式資料庫服務。dns使用的是網路查詢,使用的埠是53號埠 通常dns是以udp資料傳輸協議來查詢的,當沒有查詢到完整的資訊時,就會再次以tcp這個協議來重新查詢。所以在啟動dns時,會同時啟動tcp和udp的53號埠...