天天看點

MongoDB源碼解析:Full Text Search Index

fts本質上也是btree索引類型

索引accessmethod定義:

關鍵成員:

擷取索引的函數入口:

追蹤到:

ftssepc:是用來描述語言類型的類,定義的語言索引的一系列屬性

obj:需要被索引的文檔

keys:分詞後産生的結果

ftsindexformat的實作:

getkeys:找多文檔所有命中的索引,fts也支援組合索引,全文索引分詞的建立通過函數ftsspec::scoredocument,注意:單個文檔所有的索引加起來不能大于4mb,數量小于400000個。是以mongodb的全文索引不實用于較大的文檔。尤其是中文情況下,由于中文的複雜性,是以要格外注意,從性能角度上建議把文檔控制在幾百kb左右範圍内。

getindexkey:擷取索引key,version2的算法對較長的key進行了hash壓縮,算法是截取前32位元組的字首,後32位元組用murmurhash運算出來的數值代替,是以,最長不會超過64位元組。

ftsspec::scoredocument,分詞,然後統計頻度,最後算法評分,算法原則是單詞出現比例越大分數約高,單詞的基數越大,造成的分數差距越小,算法大概如下:

<code>exp = 2^(count-1)</code>

<code>freq = sigma(1/exp)</code>

<code>coeff = (count + totalcount) / ( 2 * totalcount)</code>

<code>score = weight * freq * coeff</code>

分詞是搜尋的基礎,mongodb目前隻支援拉丁語系的分詞處理,拉丁語的分詞相對與中文簡單很多,隻需要有限的stop-word(比如the,a,空格等)即可完成一個套簡單的分詞功能。而中文博大精深,目前還沒有非常好的開源庫實作中文分詞。

具體算法,先用stop-word進行文本切割,然後調用libstemmer三方庫進行詞幹提取,最後得到文本分詞。

經過一天的代碼學習,總結下來,要實作中文分詞首先要解決的是中文分詞器,然後是字庫。

有了兩者的基礎後,可以通過定義version版本來自定一套分詞算法,甚至是評分标準。

繼續閱讀