前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >推荐一个go的搜索引擎类库 riot

推荐一个go的搜索引擎类库 riot

作者头像
公众号-利志分享
发布2022-04-25 08:57:03
3920
发布2022-04-25 08:57:03
举报
文章被收录于专栏:利志分享

简单又高效的搜索引擎类库: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列表,查询到关联的数据详情内容。

详情内容是存在另外一个地方,这个时候搜索显得至关重要了。

我们先看一个例子:

代码语言:javascript
复制
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跳转到指定页面。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 利志分享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档