Java中如何實(shí)現(xiàn)在上億條的用戶(hù)搜索日志中找到Top100的關(guān)鍵詞
在做搜索引擎優(yōu)化、社交媒體趨勢(shì)分析、電商平臺(tái)的商品推薦等需求的時(shí)候都需要依據(jù)站內(nèi)用戶(hù)搜索的的熱門(mén)關(guān)鍵詞來(lái)分析。
對(duì)于大型網(wǎng)站來(lái)說(shuō),每天用戶(hù)搜索的關(guān)鍵詞的日志有千萬(wàn)甚至上億的量,那么如何在這些日志中找到用戶(hù)搜索的top100的熱門(mén)關(guān)鍵詞呢?下面我們來(lái)聊聊這個(gè)問(wèn)題的解決方案。
用戶(hù)搜索的的日志每天量非常的大,如果將這些搜索的日志直接加載到內(nèi)存中做分析是不可取的,因?yàn)閮?nèi)存是支撐不住的,我們可以采用“分而治之”的思想來(lái)處理這個(gè)問(wèn)題,如下所示的處理流程圖:
圖片
(1)將用戶(hù)搜索的日志文件(一個(gè)大文件)切割成若干個(gè)小文件(如設(shè)置每個(gè)小文件大小為512KB)
圖片
(2)創(chuàng)建一個(gè)長(zhǎng)度為n(如2048)的哈希表數(shù)組,用來(lái)統(tǒng)計(jì)每個(gè)小文件中關(guān)鍵詞出現(xiàn)的頻率。服務(wù)端開(kāi)啟多線程并行遍歷大文件切割出來(lái)的小文件,然后對(duì)每個(gè)用戶(hù)搜索的關(guān)鍵詞進(jìn)行哈希取模運(yùn)算,通過(guò)計(jì)算的結(jié)果將關(guān)鍵詞統(tǒng)計(jì)到哈希表數(shù)組中。
圖片
(3)最后要遍歷哈希表數(shù)組,使用小頂堆來(lái)幫助我們實(shí)現(xiàn)獲取用戶(hù)搜索Top 100的關(guān)鍵詞。
圖片
首先構(gòu)建一個(gè)小頂堆,設(shè)置堆大小為100,然后在哈希表中遍歷到的關(guān)鍵詞出現(xiàn)的次數(shù)大于堆頂關(guān)鍵詞出現(xiàn)的次數(shù),那么就用新關(guān)鍵詞替換堆頂?shù)?span>關(guān)鍵詞并重新調(diào)整為小頂堆,如下所示的小頂堆圖:
圖片
當(dāng)遍歷完哈希表之后,小頂堆中的關(guān)鍵詞就是出現(xiàn)頻率最高的100個(gè)關(guān)鍵詞。
總結(jié):
(1)使用“分而治之”的思想,將大文件分割為小文件(可以使用哈希取模法切割文件)。
(2)使用多線程遍歷每個(gè)小文件,統(tǒng)計(jì)關(guān)鍵詞的出現(xiàn)頻率。
(3)使用小頂堆(小頂堆適用于解決統(tǒng)計(jì)頻率最高的TopN的問(wèn)題)統(tǒng)計(jì)前x位的關(guān)鍵詞。