十幾萬行吧
首先創建了壹個容量為10的的布隆過濾器
然後分別加入 ‘dog’,‘fish’,‘cat’三個對象,這時的布隆過濾器的內容如下:
然後加入‘bird’對象,布隆過濾器的內容並沒有改變,因為‘bird’和‘fish’恰好擁有相同的哈希。
最後我們檢查壹堆對象(’dog’, ‘fish’, ‘cat’, ‘bird’, ‘duck’, ’emu’)是不是已經被索引了。結果發現‘duck’返回True,2而‘emu’返回False。因為‘duck’的哈希恰好和‘dog’是壹樣的。
主要分割
主要分割使用空格來分詞,實際的分詞邏輯中,還會有其它的分隔符。例如Splunk的缺省分割符包括以下這些,用戶也可以定義自己的分割符。
] ( ) { } | ! ; , ‘ ” *\n\n s\t & ? + %21 %26 %2526 %3B %7C %20 %2B %3D — %2520 %5D %5B %3A %0A %2C %28 %29
搜索
好了,有個分詞和布隆過濾器這兩個利器的支撐後,我們就可以來實現搜索的功能了。
上代碼:
Splunk代表壹個擁有搜索功能的索引集合
每壹個集合中包含壹個布隆過濾器,壹個倒排詞表(字典),和壹個存儲所有事件的數組
當壹個事件被加入到索引的時候,會做以下的邏輯
為每壹個事件生成壹個unqie id,這裏就是序號
對事件進行分詞,把每壹個詞加入到倒排詞表,也就是每壹個詞對應的事件的id的映射結構,註意,壹個詞可能對應多個事件,所以倒排表的的值是壹個Set。倒排表是絕大部分搜索引擎的核心功能。
當壹個詞被搜索的時候,會做以下的邏輯
檢查布隆過濾器,如果為假,直接返回
檢查詞表,如果被搜索單詞不在詞表中,直接返回
在倒排表中找到所有對應的事件id,然後返回事件的內容
更復雜的搜索
更進壹步,在搜索過程中,我們想用And和Or來實現更復雜的搜索邏輯。
上代碼: