持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第29天,点击查看活动详情
1 场景:设计一个搜索系统
关键字搜索 Keyword Search
相关性搜索 Relevance Search
分面搜索 Facets Search
2 Server 服务 推特搜索服务架构
2.1 索引服务 Index Service
2.2 搜索服务 Search Service
2.3 排名服务 Ranking Service
3 Storage存储
3.1 整体存储架构
Redis集群
主要用于缓存数据,约四万个结点
文件存储系统
Twitter自主开发了一个低成本和可扩展存储系统,主要存储图片、 video等大数据文件,约四万个节点
Hadoop集群
主要用于后台数据处理、分析日志记录、 约有一万个结点
MySQL
持久化存储关系型数据
3.2 DB架构
-
分库分表
-
冷热数据分离
-
读写分离
3.3 基于DB的搜索
起初Twitter未自研搜索引擎,而是使用MySQL数据库自带的搜索。对MySQL,推特基于时间做index,分成多个Timeslice table:
推文直接写到DB,写满一个表就开启下一个。搜索直接在DB进行,仅支持查询最近三天数据。
弊端
- 由于数量过大,每次搜索只支持三天所有的数据查找
- 使用MySQL搜索,能支持的查找单一,难扩展
- 单一关键词搜索,不支持对多个关键词排列组合进行搜索,filter过滤,模糊查询,范围搜索
- 当数据量过多时,数据压力较大,查询速度很慢
3.4 搜索引擎
Twitter使用Lucene开发Earlybird索引服务器:
3.5 索引文件存在哪
A.关系型数据库(MySQL)
B.非关系型数据库(Redis)
C.文件系统(HDFS)
提前对查询内容建索引,放到索引库,查询再从索引库中查询。
普通索引
生活中的索引:
目录的特点:
- 单独的结构
- 指向具体内容的位置
- 加速对书籍内容的查找
- 有些内容无法放到书籍里
- 书变厚了
倒排索引
根据内容(词语)找文档,倒排索引结构也叫反向索引结构,包括索引和文档两部分。
索引即词汇表,它是在索引中匹配搜索关键字,由于索引内容量有限且采用固定优化算法搜索速度很快,找到索引中的词汇,词汇与文档关联,从而最终找到文档。
- 提取资源中关键信息, 建立索引,对文档进行切分词组成索引
- 搜索时,根据关键字(目录),找到资源位置
分词器 Tokenizer
- 按分词器拆分出词汇
- 去除停用词和禁用词
- 如果有英文, 把英文字母转为小写, 即搜索不区分大小写
切分词:就是将一段文本,根据一定规则,拆分成一个个词,将一句句话切分成一个一个词,去掉(a an the and or)等无意义的词,空格,标点符号,重复的词大写字母转为小写字母。