在做搜索引擎优化、社交媒体趋势分析、电商平台的商品推荐等需求的时候都需要依据站内用户搜索的的热门关键词来分析。
对于大型网站来说,每天用户搜索的关键词的日志有千万甚至上亿的量,那么如何在这些日志中找到用户搜索的top100的热门关键词呢?下面我们来聊聊这个问题的解决方案。
用户搜索的的日志每天量非常的大,如果将这些搜索的日志直接加载到内存中做分析是不可取的,因为内存是支撑不住的,我们可以采用“分而治之”的思想来处理这个问题,如下所示的处理流程图:
图片
(1)将用户搜索的日志文件(一个大文件)切割成若干个小文件(如设置每个小文件大小为512KB)
图片
(2)创建一个长度为n(如2048)的哈希表数组,用来统计每个小文件中关键词出现的频率。服务端开启多线程并行遍历大文件切割出来的小文件,然后对每个用户搜索的关键词进行哈希取模运算,通过计算的结果将关键词统计到哈希表数组中。
图片
(3)最后要遍历哈希表数组,使用小顶堆来帮助我们实现获取用户搜索Top 100的关键词。
图片
首先构建一个小顶堆,设置堆大小为100,然后在哈希表中遍历到的关键词出现的次数大于堆顶关键词出现的次数,那么就用新关键词替换堆顶的关键词并重新调整为小顶堆,如下所示的小顶堆图:
图片
当遍历完哈希表之后,小顶堆中的关键词就是出现频率最高的100个关键词。
总结:
(1)使用“分而治之”的思想,将大文件分割为小文件(可以使用哈希取模法切割文件)。
(2)使用多线程遍历每个小文件,统计关键词的出现频率。
(3)使用小顶堆(小顶堆适用于解决统计频率最高的TopN的问题)统计前x位的关键词。