悟空分詞的搜尋和排序原始碼分析之 搜尋

2021-09-22 02:56:10 字數 1081 閱讀 6182

下面我們來分析一下搜尋的過程。首先構造乙個searchrequest物件。一般情況下只需提供searchrequest.text即可。

type searchrequest struct 

if request.text != ""

// 向索引器傳送查詢請求 for shard := 0; shard < engine.initoptions.numshards; shard++

這裡是否可以進行優化? 1) 只向特定的shard分發請求,避免無謂的indexer查詢過程。2)rankerreturnchannel是否不用每次都建立新的?

上面已經建立了結果的返回通道rankerreturnchannel,直接從個channel中讀取返回資料,並加入到陣列rankoutput中。 注意,如果設定了超時,就在超時之前能讀取多少就讀多少。 然後呼叫排序演算法進行排序。排序演算法直接呼叫golang自帶的sort包的排序演算法。

下面我們深入到索引器,看看索引器是如何進行搜尋的。其核心**在這裡func (engine *engine) indexerlookupworker(shard int),它的主邏輯是乙個死迴圈,不斷的從engine.indexerlookupchannels[shard]讀取搜尋請求。

針對每乙個搜尋請求,會將請求分發到索引器去,呼叫func (indexer *indexer) lookup(tokens string, labels string, docids map[uint64]bool, countdocsonly bool) (docs types.indexeddocument, numdocs int)方法。其主要邏輯如下:

將分詞和標籤合併在一起進行搜尋

合併搜尋到的docid,並進行初步排序,將docid大的排在前面(實際上是認為docid越大,時間越近,時效性越好)

然後進行排序,bm25演算法

最後返回資料

jieba分詞原始碼分析

jieba是乙個開源的中文分詞庫。posseg 自定義詞典 init.py jieba分詞的入口 compat.py dict.txt 總的詞庫,記錄乙個詞 詞頻和詞性 test 測試demo encoding utf 8 import jieba seg list jieba.cut 我來到北京清...

排序演算法分析以及原始碼

排序演算法 描述 時間複雜度 空間複雜度 穩定性 說明 氣泡排序 正反迴圈 o n n o 1 是 插入排序 慢慢有序 o n n o 1 是 歸併排序 分治o n logmn o n 是 基數排序 求餘o n logmn o 11n 是lsd msd 選擇排序 選擇min or max o n n...

egret原始碼分析1 檢視和編譯原始碼

開啟egret安裝路徑,可以看到下面目錄 其中,src是egret的typescript原始碼,build是編譯後的js 當我們新建乙個egret工程的時候,會把build目錄下的js拷貝到libs modules目錄下。那麼怎麼修改和編譯原始碼呢?src可以在webstorm下開啟,或者直接用su...