搜索系统设计(上)

191 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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)

提前对查询内容建索引,放到索引库,查询再从索引库中查询。

普通索引

生活中的索引:

目录的特点:

  • 单独的结构
  • 指向具体内容的位置
  • 加速对书籍内容的查找
  • 有些内容无法放到书籍里
  • 书变厚了

倒排索引

根据内容(词语)找文档,倒排索引结构也叫反向索引结构,包括索引和文档两部分。

索引即词汇表,它是在索引中匹配搜索关键字,由于索引内容量有限且采用固定优化算法搜索速度很快,找到索引中的词汇,词汇与文档关联,从而最终找到文档。

  1. 提取资源中关键信息, 建立索引,对文档进行切分词组成索引
  2. 搜索时,根据关键字(目录),找到资源位置

分词器 Tokenizer

  • 按分词器拆分出词汇
  • 去除停用词和禁用词
  • 如果有英文, 把英文字母转为小写, 即搜索不区分大小写

切分词:就是将一段文本,根据一定规则,拆分成一个个词,将一句句话切分成一个一个词,去掉(a an the and or)等无意义的词,空格,标点符号,重复的词大写字母转为小写字母。