Golang项目整合Riot库实现全文搜索功能

发表时间: 2021-03-08 17:18

之前自己些的协作系统或者说是记事本项目都用的java语言编写的,因为有Lucene作为应用内搜索的首选,所以也就无需担心。

前两年用go语言写了一个简单的文档发布系统,还缺少全文检索的支持,一度想自己写一个简单的全文检索,奈何时间精力有限,也没时间写。最近又试图在github上找一款是不是有别人写的类似的东西,目前发现一款roit貌似满足要求。

官网地址:
https://github.com/go-ego/riot

我的目标:

  • 中英文混合搜索
  • 可以支持逻辑表达式 and 和 or
  • 能直接嵌入到我的项目中并支持指定字典文件
  • 支持持久化和实时更新

于是根据官网的示例,我写了如下示例

main.go

package mainimport (	"encoding/json"	"log"	"github.com/go-ego/riot"	"github.com/go-ego/riot/types")var (	searcher = riot.Engine{} //.New("zh"),参数zh指的是使用roit安装库中的字典文件这样使用的话,必须手动安装到部署目标电脑,比较不方便)func main() {	searcher.Init(types.EngineOpts{		//GseDict: "zh", 指定程序目录下的文件,就不用依赖roit库中的字典文件了文件了		GseDict:  "dictionary.txt",		Using:    1,		// 必须用这个,否则不能持久化,重新执行就是新得数据		UseStore: true,	})	defer searcher.Close()	data := types.DocData{Content: `I wonder how, I wonder why		, I wonder where they are`}	data1 := types.DocData{Content: "所以, 你好, 再见"}	data2 := types.DocData{Content: "没有理由"}	searcher.Index("1", data)	searcher.Index("2", data1)	searcher.Index("3", data2)	searcher.Flush()	log.Println("now index number: ", searcher.NumDocsIndexed())	// 使用了逻辑或的方式搜索,如果想使用与的方式,写成 Logic: types.Logic{Must: true}	req := types.SearchReq{Text: "你好啊,where", Logic: types.Logic{Should: true}}	search := searcher.Search(req)	// 序列化成json方便查看结果	text, _ := json.MarshalIndent(search, "", "	")	log.Println("search...", string(text))}

基本的注意点都写在了注释里了。