6.5 搜索引擎的基本架构
1.互联网搜索引擎整体架构
2.爬虫系统架构
3.爬虫禁爬协议
user-agent:GoogleBot
Disallow:/tmp/
Disallow:/cgi-bin/
Disallow:/users/paranoid/
4.文档矩阵与倒排索引
正排索引:文档====>关键词(文档中包含哪些关键词,建立索引)
倒排索引:关键词====>文档(关键词出现在哪些文档中,建立索引)
解析:“后端技术”的搜索结果:(2,4,5,7)与(1,2,4)取交集=(2,4)。
可支持万亿级别文档搜索。
5.带词频数与位置的倒排索引
6.Lucene 架构
开源搜索引擎 Lucene 架构:
7.Lucene 倒排索引
8.Lucene 索引文件准实时更新
索引有更新,就需要重新全量创建一个索引来替换原来的索引。这种方式在数据量很大是效率很低,并且创建一次索引的成本很高,性能也很差。
Lucene 中引入了段的概念,将一个索引文件拆分为多个子文件,每个子文件叫做段。每个段都是一个独立的可被搜索的数据集,索引的修改针对段操作。
新增:当有新的数据需要创建索引时,原来的段不变,选择新建一个段来存储新增的数据。
删除:当需要删除数据时,在索引文件新增一个.del 的文件,用来专门存储被删除的数据 Id。当查询时,被删除的数据还是可以被查到的。
只是在文档链表合并时,才把已经删除的数据过滤掉。被删除的数据在进行段合并时,才会真正被移除。
更新:更新的操作其实就是删除和新增的组合。先在.del 文件中记录旧数据,再在新段中添加一条更新后的数据。
为了控制索引段的数据,我们必须定期合并段数据。
优点:搜索功能很强大。
缺点:不支持分布式集群。只能用一台服务器构建索引。如果数据量比较大,一台服务器可能不够用。高可用----服务器宕机,倒排索引丢失,也不能提供搜索服务
为了提高 Lucene 可用性,支持处理更大的数据规模,使用 ElasticSearch。
9.ElasticSearch 架构
索引分片,实现分布式
索引备份,实现高可用
API 更简单,更高级
理念:包装 Lucene,把 Lucene 的单机搜索引擎包装成了一个分布式集群。通过集群的方式,对外提供服务。
10.ElasticSearch 分片预分配与集群扩容
PUT /my_index
{
"settings":{
"number_of_shards":2,
"number_of_replicas":0
}
}
shard=hash(routing)%number_of_primary_shards
解析: 分片预分配 2 片,可扩容一台服务器至两台,但是扩容到第三台服务器时,不能再进行扩容。预分配只有 2 片。
解决: 一开始做好预分配。------集群规模与分片数目相关的。集群规模==分片数目时,无法在扩容。
搜索引擎的核心:1.倒排索引如何建立。2.搜索如何通过倒排索引完成。3.数据如何获得的?爬虫。爬虫来的数据如何构建倒排索引。
生产环境中常用的搜索引擎:ElasticSearch.
评论