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