搜索引擎——知识梳理
来源:互联网 发布:被雷劈死的国师知乎 编辑:程序博客网 时间: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
- 搜索引擎——知识梳理
- vb.net——数据库知识梳理
- 【三层架构】——知识梳理
- 数据结构—线性表(知识梳理)
- 机器学习实战—知识梳理—k-近邻算法
- 知识梳理-理解MySQL——索引与优化
- JAVA知识点梳理第一部分——常规知识
- 菜鸟的成长之——C语言知识梳理
- 黑马程序员—C语言结构体知识梳理
- 知识梳理
- 知识梳理
- 知识梳理
- 知识梳理
- 知识梳理
- 《这就是搜索引擎-核心技术详解》简单梳理+一些知识图谱的知识
- 知识梳理(一)——C++ 虚函数表解析
- 知识梳理(二)——父类的同名变量被隐藏
- 黑马程序员——java基础(IO部分知识梳理)上
- Mysql的with rollup功能(5.1以上版本)
- 17个提高PHP编程效率 引入缓存机制提升性能
- 2015年5月11日-2015年5月15日一周总结
- visu studio编程中L、TEXT、_TEXT、_T 用法说明
- TCP/IP 建立连接的过程?(3-way shake)
- 搜索引擎——知识梳理
- Swift 常量、变量定义使用 String和简单控件的使用
- java设计模式--装饰者模式
- jira安装破解等相关信息
- Java类加载器
- c#中DllImportAttribute用法汇总
- JAVA中的反射机制
- JAVA正则表达式语法
- Android Webview