非原创,内容源自:
https://zhuanlan.zhihu.com/p/139041529
https://www.cnblogs.com/zlslch/p/6440114.html
目录
1 过程
假设只有5个网站:
内容分词,形成 “倒排列表”,放在磁盘中,调用时调入内存
倒排列表:
DocID | 分词出现的 文档编号 |
---|---|
TF | 分词在该文档 出现的次数 |
<POS> | 分词在该文档 出现的位置 |
百度会参考:
热度、你的搜索记录,网站给的钱等等综合打分,按评分高低返回 排好序的搜索结果
世界上有亿万文档,此时怎么找的更快,更准,这需要算法
2 出现的问题
2.1 问题1 - 哈希冲突
解决冲突:冲突表,也是链表,链表过长用 红黑树,b树代替
b树:
2.2 问题2 - 文件太多
文档的数量庞大
2.3 问题3 - 读取文档
如何从磁盘中读取文档
1 两次遍历法
2 排序法
2.3.1 两次遍历法 ( 空间换时间 )
第 1 遍:确定要开辟多大的内存来显示文档
第 2 遍:边扫描,边匹配对应的文档编号(三元组中的第 1 个数),载入内存
具体:
第 1 遍:扫描文档,找到文档数量N, 文档集合内 包含的不同单词数M 和 每个单词出现的频率DF
不足
文档集合有多大,内存就有多大,很可能内存溢出
2.3.2 排序法 ( 时间换空间 )
首先:内存大小是固定的
解析文档,构造(单词ID,文档ID,单词频率)三元组 - 排序,按单词ID,文档ID,单词频率先后排
若内存满了,将这些三元组写入临时文件A中,但词典一直在内存中!