搜索中一些工程問題

1、 倒排拉鍊如果很長如何處理

(1)倒排拉鍊的長度是有限制的,這個長度限制是億級別的,所以一般不會超出,如果真的超出就會截斷

(2)可能超出長度的是一些停用詞,如果超出就會截斷,並且停用詞在建立倒排的時候,位置信息只建立一個,因爲這些詞一般無意義只是爲了召回,如果位置信息太多,在後續計算proximity score的時候比較耗時,這些需要處理的詞是挖掘好的詞表

2、如何提升索引檢索的性能

(1)索引分區

索引可以分區,按照termid分區即可,這樣取一個term的doclist的時候,首先將term轉化爲termid,然後termid%分區數就可以hash到這個termid的索引塊,然後在這個索引塊中進行二分查找找到這個termid對應的doclist

(2)索引查找

索引查找主要使用的是跳錶查找,先看一下數據結構

首先word的doclist在物理機上存儲的基本單位是section,每個section中存儲一定量的doclist,假設某個word的doclist有1024個,每個section可以存儲512個docid,那麼這個word需要兩個section,如果有多個section,那麼多個section可以使用跳錶連接起來

在section內部,doclist也是有大小順序的,這樣這些doclist也可以再次使用跳錶結構

其中section級別的跳錶有1級,doclist級別的跳錶有2級

 

struct qsrchSEGItem {
    uint32_t _M_offset;
    uint32_t _M_size;
    // 當前segment最小docid
    uint32_t _M_skipdoc;         
};
struct qsrchDOCHead {
    uint64_t _M_basedoc:32;
    // 當前section最小docid
    uint64_t _M_skipdoc:32; 
    …
}

1、首先倒排列表被分配到多個sectiont中,每個section默認8192個倒排id,如果倒排id有10000個那麼這個倒排列表被分配到2個sectiont中

2、sectiont之間是和sectiont內部的doc是逆序排列的,也就是有序的,這樣就可以形成跳錶結構了

3、查詢sectiont,每次查詢先查詢sectiont的最大id以及sectiont的size,如果目標在id-size之間,就定位了sectiont

4、在sectiont內部查找目標,原理同查找section差不多

(3)查找順序

查找的時候先把倒排拉鍊按照長短排序,先找用短的查找長的;而且在查找的時候一個doc查完才查另一個doc,例如

word1 :  1 3 5 6

word2 : 1 3 5 8 10 12

word3: 1 2 5 7 10 14 16 18

先把word按照查找倒排長短排序,短的在前,然後word1中先用1查找word2中的1,找到以後再查找word3中的1,如果都查找到則這個docid 1爲有效docid。

然後word1中用3查找word2中的3,找到以後再找word3中的3,發現沒有找到那麼docid3 不是有效id

(4)索引壓縮

索引壓縮的基本單位是section,索引壓縮的主要用途是爲了減少磁盤io操作,否則磁盤佔用的塊會比較多,比較消耗io

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章