说到搜索工具呢,估计很多程序员都想到了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
查询过程
- 解析查询语句
- 生成查询树
- 查询树根节点获取doc_id
- 合并查询树结果
- 打分和排序
- 补全和格式化搜索结果
- 返回
第三方库
- rocksdb(包括snappy,gflags)
- gtest
- jemalloc