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版本來自定一套分詞算法,甚至是評分标準。