上手gofound搜索引擎|青训营笔记

767 阅读3分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第3篇笔记

本文将介绍Gofound搜索引擎的基本框架和API,并编写一个简单的客户端程序将悟空数据集上传到Gofound引擎建立的数据库

一、初识gofound

gofound项目的Github地址为:github.com/newpanjing/…

由于gofound官方本身已经提供了比较详细的文档,而且本文的重点也不在于深入剖析项目源码,因此这里仅对gofound做简单概括:gofound 是一个利用http服务实现的全文检索引擎,支持持久化和单机亿级数据毫秒级查找。

项目依赖

索引的基本原理与流程

采用平衡二叉搜索树对文本关键词进行索引,然后利用leveldb存储id值,以及对应的文档。

二、gofound的安装与测试

安装流程

  1. 将项目源码克隆到本地:git clone github.com/newpanjing/…
  2. 编译安装: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":……}