搜索引擎——知识梳理

来源:互联网 发布:被雷劈死的国师知乎 编辑:程序博客网 时间:2024/06/06 20:53

1.输入框

1.1输入的搜索条件可以自动补全

按照词被搜索的频率进行排序
用户在输入搜索关键词时,根据已经输入的部分,自动提示出后面可能需要输入的词,既减少了用户输入的劳动量,也可以提示用户当前有哪些备选,有效的降低输错的几率,提升搜索的体验。
(例子:汉字提示的功能,从User Log中提取出每天搜索频率最高的词,和这些词命中的搜索结果数,更新到服务器中,然后提供补全提示功能。数据每天凌晨增量更新一次,保证数据的实时性。
用户输入,用户每次按下键盘,触发js的keydown事件,发送一个请求到CGI,CGI将用户输入的内容送到SuggestSvr,suggestsvr分解用户输入串,根据编码去树中查询,最后将结果压入优先级队列中,返回搜索频率最高的前10个结果给用户,值得一提的是,我们对返回结果的用户的KeyWord做了分词处理,以保证用户的搜索结果更加丰富
增加对拼音的支持,准备汉字到拼音映射表。存在的挑战:
1.一字多音,例如阿,可以读a,可以读e,这就导致在二维数组中,对“阿”查找拼音的时候比较麻烦,这里的做法是根据频率选择一个搜索频率比较高的
2.同音短语,比如:手机和收集,对应的拼音都是"shou'ji",这种情况处理起来比较简单,在上面的Node结构中,有一个DocInfo *pDocInfo,以数组的方式记录了拼音对应的所有同音短语
3.简拼,比如:sj,对应的可能是"手机",“收集”,“四级"........这种情况,在上面的Node结构中,有一个ctag=-2标识声母,通过这种方式,可以很好的处理简拼
4.混拼,比如:nuojy,对应的是“诺基亚”,混拼的处理方式和简拼的方式比较类似

1.2后台数据增量更新
1.3支持分词
1.4拼音到汉字的映射
1.5拼音缩写到汉字的映射

2.执行搜索

 2.1 同义词,主要用户扩大搜索结果范围

       搜索“婴儿“,标题中含有“宝宝”的也可以出来

       搜索“一”,标题中含有“1”的也可以出来

 2.2 同音词,主要用于纠错

       搜索“诺积压“,提示用户是否需要搜索”诺基亚“

       同音判断

       搜索”Marcbook”,提示用户是否需要搜索“MacBook”

       步长判断

3.索引

3.1 分布式索引

   为什么需要分布式

       减低数据压力,便于并行处理

       如何分布

数据切分方式

       如何扩容

针对部分节点扩容,不需要每次都用翻倍的方式扩容

3.2 增量索引

     数据量不断增大,索引文件变大

 

       增量切换的时间增长,切换的风险增加

 

       增量索引和全量索引的合并

 

       实时搜索引擎

3.3 索引存储

   差分存储

       {1,4,7,9}存储为{1,3,3,2}

 

       VInt压缩

       每字节的高位表示是否还有剩余字节

       低七位表示数值

0~127使用一个字节表示

128:00000001 10000000

4.全文检索的整体架构

        Web: 使用TWS服务器,接受用户请求,处理业务逻辑,渲染页面,80%以上的产品需求集中在这里

       Commserver:协议分发服务器,将不同的请求发送到不同的后台

       CacheServer:缓存服务器,协议级Cache,支持即时删除,LRU淘汰,有70%左右的命中率

       UnionServer:聚合服务器,将分布式搜索系统返回的检索结果合并

       SearchKernel:检索服务器,负责处理搜索请求

       DocServer:文档服务器,负责存储具体的文档信息,返回完整的文档信息给用户

       IndexServer:索引服务器,负责生成索引

       TransferServer:中转服务器,负责综合排序,将商城数据格式化为搜索的标准数据格式

5.全文检索的处理流程

        用户发送搜索请求,Web层对用户的输入条件进行过滤,进行同义词、直达…处理,将处理后的请求发送到commserver

       Commserver根据Appid对请求分发到Cache或者其他后台,负载均衡

       Cache收到请求后判断是否命中,命中则返回,不命中则转发给UnionServer,同时cache存储返回结果

       UnionServer收到请求后,负载均衡,分发给各个SearchKernel并行检索

            SearchKernel的处理流程  :      

              SearchKernel收到用户请求,解析出查询串

              针对查询串进行分析,生成语法树

              对语法树每个节点,进行分词查询倒排索引

              对查询出的多个倒排索引按照语法关系,进行逻辑运算

              按照DocId进行其他查询条件的过滤

              对DocId进行排序

              将DocId返回给UnionSvr

              SearchKernel检索后,返回排好序的DocId集合


       Union对各个后台返回的Docid集合进行合并

       Union把合并后的结果集发送到DocSvr,获取完整文档信息,返回给CacheSvr



0 0
原创粉丝点击