这是我参与「第三届青训营 -后端场」笔记创作活动的第3篇笔记
本文将介绍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值,以及对应的文档。
二、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可以看出,这正是我们刚刚添加的那条索引
三、将官方数据集提交到gofound数据库当中
下面尝试写一个简单的客户端程序将官方提供的悟空数据集(Noah-Wukong Dataset)提交到gofound建立的数据库当中
客户端提交数据
//将悟空数据集当中的数据上传的gofound服务器当中
func sendReqByDatafile(client *http.Client) {
filename := "data/wukong50k_release.csv"
fp, err := os.Open(filename)
if err != nil {
log.Fatalf("can open file, err is %+v", err)
}
defer fp.Close()
var reqId int = 0
reader := csv.NewReader(fp)
reader.Read() //读取表头
for {
row, err := reader.Read()
if err == io.EOF {
break
}
data := RequestData{}
data.Id = reqId
data.Text = row[1]
data.Url = make(map[string]string)
data.Url["url"] = url.QueryEscape(row[0]) //url将编码之后发送
//将结构体数据转化为jsondata之后发送
jsonData, _ := json.Marshal(data)
sendJsonReq(client, jsonData)
reqId++
}
}
func main() {
client := &http.Client{}
sendReqByDatafile(client)
}
使用go run运行上述代码,通过gofound服务器日志可以看到大量提交信息
检索测试
使用“美沃数码灯”这一关键词进行检索:
在终端输入 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":……}