[专题]从零打造一个搜索引擎(序)

说到搜索工具呢,估计很多程序员都想到了EleasticSearch或者solr,sphinx,XunSearch.实际上我第一次接触搜索引擎是2012年,那个时候业余接了个活,帮一个中俄外贸网站增加搜索功能,因为原生的mysql无法胜任这个工作。当时使用的是sphinx,那时中文还没有分词器,是按字索引。那个时候啥也不懂,只能按网上的教程一步步依葫芦画瓢。现在还能看到当时在论坛的发帖http://sphinxsearch.com/forum/search.html?q=tiyee&f=1&order=weight 现在看来问题自然是十分幼稚可笑,但这个短暂的经历并没有将我代入搜索系统的大门。

第一次大规模使用要到2015年底,我在微博本来是负责移动端api开发,后来突然被调到微博头条,我负责了多个业务模块,搜索系统就是其中之一。当时尝试了很多方法,最开始用leveldb建立倒排索引,redis做缓存加速。后来又尝试了sphinx,直到最后才使用elasticsearch。从此刻起,才开始慢慢了解搜索引擎的各种细节。也从心里萌发了写一个搜索引擎的念头。苦于时间,此计划并未实施,直到去年年底才开始写下第一行c++代码,正式进入实施阶段。 后续代码会以MIT协议开源到https://github.com/tiyee/garuda

架构

搜索引擎的架构本身并不复杂,主要包括索引检索两部分。基本的结构如下图所示:

模块

整个程序由c++开发,其中底层存储暂时用rocksdb.其他模块为自研。大致的模块如下:

  • net
  • query
  • encoding
  • serch
  • score & sort
  • store
  • utils

查询过程

  1. 解析查询语句
  2. 生成查询树
  3. 查询树根节点获取doc_id
  4. 合并查询树结果
  5. 打分和排序
  6. 补全和格式化搜索结果
  7. 返回

第三方库

  • rocksdb(包括snappy,gflags)
  • gtest
  • jemalloc