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