GoFound搜索引擎|青训营笔记
本文将介绍Gofound搜索引擎的基本框架和API,并编写一个简单的客户端程序将悟空数据集上传到Gofound引擎建立的数据库
初识gofound
gofound项目的Github地址为:github.com/newpanjing/…
由于gofound官方本身已经提供了比较详细的文档,而且本文的重点也不在于深入剖析项目源码,因此这里仅对gofound做简单概括:gofound 是一个利用http服务实现的全文检索引擎,支持持久化和单机亿级数据毫秒级查找。
项目依赖
- 采用了Gin(github.com/gin-gonic/g…
- 采用了jiebago(github.com/wangbin/jie…
- 采用了levelDB (github.com/google/leve…
索引的基本原理与流程
采用平衡二叉搜索树对文本关键词进行索引,然后利用leveldb存储id值,以及对应的文档。
倒排索引
倒排索引与词典索引类似,用一本书的倒排索引作为示例,key 存储了单词,value 存储了一个组成页数的数组,当你需要查找I search keywords in Google.这句话时,你可以很直观的看到它的单词在哪一页。
倒排索引中,每个单词都有一个引用指向属于它的一个倒排列表,倒排列表中存储了众多的倒排项,倒排项即文档 ID。取出多个单词的倒排列表后,可以根据情况进行交集处理与评分,获取到更符合预想的搜索结果。
正排索引
正排索引存储了文档 id 和索引词组的映射,便于在修改索引时判断索引 text 变更,以及计算相关度。正排表是以文档的ID为关键字,表中记录文档中每个字的位置信息,查找时扫描表中每个文档中字的信息直到找出所有包含查询关键字的文档。
gofound的安装与测试
安装流程
- 将项目源码克隆到本地:git clone github.com/newpanjing/…
- 编译安装:go get && go build -o gofound
简单测试
执行 ./gofound --addr=:8080 --data=./data 之后gofound引擎启动了对localhost:8080端口监听,数据库文件保存在./data目录下,gofound打印出如下日志信息
下面利用官方提供的API文档,分别尝试向数据库中添加一条索引和查询索引
添加索引
新建一个终端并输入
curl -H "Content-Type:application/json" -X POST --data '{"id":88888,"text":"深圳北站","document":{"title":"阿森松岛所445","number":223}}' http://127.0.0.1:8080/api/index
(这条指令是向gofound服务器上传如下含义的索引)
终端返回 {"state":true,"message":"success"} 表明记录上传成功
查询索引
在终端输入
curl -H "Content-Type:application/json" -X POST --data '{"query":"深圳北站","page":1,"limit":10,"order":"desc"}' http://127.0.0.1:8080/api/query
(这条指令使用"深圳北站"作为文本去进行查询)
终端返回结果为:
{"state":true,"message":"success","data":{"time":1.781208,"total":1,"pageCount":1,"page":1,"limit":10,"documents":\[{"id":88888,"text":"深圳北站","document":{"number":223,"title":"阿森松岛所445"},"score":1,"keys":\["北站","深圳"]}],"words":\["深圳","北站"]}}
通过id可以看出,这正是我们刚刚添加的那条索引
检索测试
使用“美沃数码灯”这一关键词进行检索:
在终端输入
curl -H "Content-Type:application/json" -X POST --data '{"query":"美沃数码灯","page":1,"limit":10,"order":"desc"}' http://127.0.0.1:8080/api/query
得到的检索结果如下(检索用时0.668s, 总共128条记录,共13页,当前是第1页,每页最多10条记录):
{"state":true,"message":"success","data":{"time":0.7871250000000001,"total":128,"pageCount":13,"page":1,"limit":10,"documents":……}
总结
gofound项目Web层和搜索引擎层核心API进行了分析,总结出gofound服务框架的基本轮廓:
暂时无法在文档外展示此内容
- Web层利用Gin框架处理与客户端之间的数据传输,利用Container提供的服务实现索引的查询和添加
- Container层中的Engine实现了查询索引和添加索引的具体逻辑,调用Tokenizer提供的分词服务,
调用LeveldbStorage层提供的与数据库交互的服务