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

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

官网地址:

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

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

main.go

 package main

import (
" encoding / json "
"log"

"github.com/go-ego/riot"
"github.com/go-ego/riot/types"
)

 var  (
 Search er = 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))
}
  

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