简单又高效的搜索引擎类库:riot
首先我们看看它的介绍:
https://github.com/go-ego/riot/blob/master/README_zh.md
特点:
高效索引和搜索(1M 条微博 500M 数据28秒索引完,1.65毫秒搜索响应时间,19K 搜索 QPS)
支持中文分词(使用 gse 分词包并发分词,速度 27MB/秒)
支持逻辑搜索
支持中文转拼音搜索(使用 gpy 中文转拼音)
支持计算关键词在文本中的紧邻距离(token proximity)
支持计算BM25相关度
支持自定义评分字段和评分规则
支持在线添加、删除索引
支持多种持久存储
支持 heartbeat
支持分布式索引和搜索
可实现分布式索引和搜索
采用对商业应用友好的Apache License v2发布
查看分词规则
下面我们看下使用:
我们其实很多时候想通过搜索,拿到索引的id 然后通过索引的id列表,查询到关联的数据详情内容。
详情内容是存在另外一个地方,这个时候搜索显得至关重要了。
我们先看一个例子:
package main
import (
"fmt"
"github.com/go-ego/riot"
"github.com/go-ego/riot/types"
)
var (
// searcher 是协程安全的
searcher = riot.Engine{}
)
func main() {
// 初始化
searcher.Init(types.EngineOpts{
Using: 3,
GseDict: "zh",
})
defer searcher.Close()
textMap := map[string]string{
"1": "张三",
"2": "李四",
"3": "王五",
"4": "狗蛋",
"5": "小屁孩",
"6": "小姑娘",
"7": "小小家",
"8": "大小一样吗?",
}
// 将文档加入索引
for k, v := range textMap {
searcher.Index(k, types.DocData{Content: v})
}
// 等待索引刷新完毕
searcher.Flush()
// 搜索输出格式见 types.SearchResp 结构体
resSearch := searcher.Search(types.SearchReq{Text: "小"})
//返回的文档结构,需要使用断言
if res, ok := resSearch.Docs.(types.ScoredDocs); ok {
fmt.Println(res)
}
}
上面的例子搜索能够获取到id,我们业务中更多可能是再通过id跳转到指定页面。