百度的一道面试题,我的知识掌握的太少了,这道题看来看去却无从下手,期待高手指点。系统设计题
实现一个简化的搜索提示系统。给定一个包含了用户query的日志文件,对于输入的任意一个字符串s,输出以s为前缀的在日志中出现频率最高的前10条query。
提示:
1、可以预处理日志
2、假设query不超过10亿条,每个query不超过50字节。
3、考虑在大查询量的情况下如何实现分布式服务静待高手!
注:这里的“日志”是什么?就是一个txt文件么?怎么做才能算是“预处理日志”?还有就是“分布式服务”如何实现?
查询日志是记录用户操作的,比如用下面格式:
时间 ip 查询词……这里其实就给查询词计数,比如1万个人搜索了java,所以有1万条日志包含java这个关键词。有8000人搜索了jdk这个关键词,则8千条日志包含jdk这个关键词。
你的任务是,当用户在搜索框输入j的时候,自动提示java、jdk等。预处理自然就是处理日志文件,分析词汇出现的频率,并按照前缀编码处理一下。选择合适的数据结构。
2.还一台E服务器做一个适配,当收集到一条查询的时候,按照某种算法决定将该条查询存入ABCD的哪一台去(这一阶段相当于预处理)
3.在E上面再做一个分发查询,根据上一步提到的算法(类似于索引之类的)判断到哪台机器去查询,并得到查询结果。结束!
1、预处理:query可以作为一个最原始的数据文件,预处理程序在平时就对query文件进行分析、统计、归类,如查询某关键字“java”,将包含java关键字的所有数据放入单独java.txt中(相同数据合并,并统计查询次数,可根据查询次数倒序排列);另外建立索引文件,文件内容为关键字、文件名字段(如:java java.txt);同时预处理程序对新加入query文件数据进行实时处理,解析新加入数据看包含哪些关键字,实时通信相应文件;通过预处理缩小查询文件大大提高性能。
2、分布式:多台搜索主机分工对索引文件查询,A主机查询字母,B主机查询数字,C主机查询汉字;web服务器接到查询请求,字母找A主机查询,数字找B查询,汉字找C;多台服务器增加查询效率