百度的一道面试题,我的知识掌握的太少了,这道题看来看去却无从下手,期待高手指点。系统设计题
实现一个简化的搜索提示系统。给定一个包含了用户query的日志文件,对于输入的任意一个字符串s,输出以s为前缀的在日志中出现频率最高的前10条query。
提示:
1、可以预处理日志
2、假设query不超过10亿条,每个query不超过50字节。
3、考虑在大查询量的情况下如何实现分布式服务静待高手!
注:这里的“日志”是什么?就是一个txt文件么?怎么做才能算是“预处理日志”?还有就是“分布式服务”如何实现?

解决方案 »

  1.   

    题目都说了是“用户query的日志文件”,1楼的明显不对。
    查询日志是记录用户操作的,比如用下面格式:
    时间 ip 查询词……这里其实就给查询词计数,比如1万个人搜索了java,所以有1万条日志包含java这个关键词。有8000人搜索了jdk这个关键词,则8千条日志包含jdk这个关键词。
    你的任务是,当用户在搜索框输入j的时候,自动提示java、jdk等。预处理自然就是处理日志文件,分析词汇出现的频率,并按照前缀编码处理一下。选择合适的数据结构。
      

  2.   

    要不我说一下我个人的思路:1.假设有A、B、C、D四台服务器收集该日志(这四台体现了一个分布式思想)
    2.还一台E服务器做一个适配,当收集到一条查询的时候,按照某种算法决定将该条查询存入ABCD的哪一台去(这一阶段相当于预处理)
    3.在E上面再做一个分发查询,根据上一步提到的算法(类似于索引之类的)判断到哪台机器去查询,并得到查询结果。结束!
      

  3.   

    一直在唠叨jbox 、Lucene却从未实践过,不过倒想问问LZ是想要一个简单的例子呢 还是 想要一套方案啊关注
      

  4.   

    回复楼上的,简单例子或者一个方案都可以,当然了,最好还是解决这个问题的一套方案。期待ing
      

  5.   

    有道理,没接触过搜索引擎,看了楼上几位发言,总结下
    1、预处理:query可以作为一个最原始的数据文件,预处理程序在平时就对query文件进行分析、统计、归类,如查询某关键字“java”,将包含java关键字的所有数据放入单独java.txt中(相同数据合并,并统计查询次数,可根据查询次数倒序排列);另外建立索引文件,文件内容为关键字、文件名字段(如:java java.txt);同时预处理程序对新加入query文件数据进行实时处理,解析新加入数据看包含哪些关键字,实时通信相应文件;通过预处理缩小查询文件大大提高性能。
    2、分布式:多台搜索主机分工对索引文件查询,A主机查询字母,B主机查询数字,C主机查询汉字;web服务器接到查询请求,字母找A主机查询,数字找B查询,汉字找C;多台服务器增加查询效率
      

  6.   

    补充点,web服务器可与A、B、C通过TCP通信实现交互
      

  7.   

    lucene涉及到分词问题,不是任意字符串都会索引的,如果非得要任意字符串检索的话,还是放数据库里干吧(行对行),不过这和数据库的类型关系很大,ORACLE有专门针对此类问题的解决方案(索引方案),别的库性能就不是很好了,如果数据超过1亿了建议再拆表,以5000万为单位拆成两至三张表,应该会很快速就能出结果。