【Go语言实战】(26) 分布式搜索引擎

news2024/9/28 13:17:55

Tangseng 基于Go语言的搜索引擎

github地址:https://github.com/CocaineCong/tangseng

详细介绍地址:https://cocainecong.github.io/tangseng

这两周我也抽空录成视频发到B站的~ 本来应该10月份就要发了,结果一鸽就鸽到现在hhhh,有兴趣的同学也可留意一下~

项目大体框架

  1. gin作为http框架,grpc作为rpc框架,etcd作为服务发现。
  2. 总体服务分成用户模块收藏夹模块索引平台搜索引擎(文字模块)搜索引擎(图片模块)。注册到etcd中,并进行服务发现。
  3. 分布式爬虫爬取数据,并发送到kafka集群中,再落库消费。现阶段使用数据集文本输入 (虽然爬虫还没写,但不妨碍我画饼…)
  4. 搜索引擎模块的文本搜索单独设立使用boltdb存储index,mapreduce+kafka集群加速索引构建并使用roaring bitmap存储索引。
  5. 使用 trie tree 实现词条联想。
  6. 图片搜索使用ResNet50来进行向量化查询 + Milvus or Faiss 向量数据库的查询 (开始做了… DeepLearning也太难了…)。
  7. 支持多路召回,go中进行倒排索引召回,python进行向量召回。通过grpc调用连接,进行融合。
  8. 支持TF-IDF,BM25等等算法排序。
  9. 第三方容器纯docker拉取启动。

在这里插入图片描述

🧑🏻‍💻 前端地址

all in react, but still coding react-tangseng

由于我真的不怎么会写前端,前端大佬别骂了…这里就放两个页面…

搜索页面
在这里插入图片描述
搜索结果页面

在这里插入图片描述

🌈 项目主要功能

1. 用户模块

  • 登录注册

2. 收藏夹模块

  • 创建/更新/删除/展示 收藏夹
  • 将搜索结果的url进行收藏夹的创建/删除/展示

3. 索引平台

3.1 文本存储

正排库

目前存放在mysql中,但后续会放到OLAP,starrocks可以承受单表亿级数据毫秒级查询,像mysql这种OLTP到这个级别早就分库分表了,不然这张表或者这个库就废了,索引页也救不活…

倒排库

x.inverted 存储倒排索引文件
x.trie_tree 存储词典trie树

目前使用 mapreduce+kafka 集群 来构建倒排索引

在这里插入图片描述

  • map任务将数据拆分以下形式
{
  "token":"xxx",
  "doc_id":1
}
  • reduce任务将所有相同 token 的 doc_id 合并在一起

存储doc id使用roaring bitmap这种数据结构来存储,尽可能的压缩空间

在索引平台中,离线构建的倒排索引会进行合并操作

  • 每天产生的数据将存放同一个文件中. eg: 2023-10-03.inverted
  • 每周的周日会将这一周的数据都合并到当月中. eg: 2023-10.inverted
  • 每月的最后一天会把该月合并到该季度中. eg: 2023-Autumn.inverted
向量库

向量库采用milvus来存储向量信息,这部分逻辑是放在python的,因为文本向量化基本都是python垄断

4. 搜索模块

4.1 文本搜索

  • 倒排召回

因为 boltdb 是kv数据库,所以直接获取所有的对应的query对应的 doc id 即可,这部分使用的是golang实现的,并提供了grpc接口。

  • 向量召回

query向量化,并从milvus中查询获取,这部分使用的python实现,并提供了grpc接口。

  • 融合

将倒排和向量两个纬度的索引信息召回进行融合。

  • 排序

bm25进行排序

4.2 图片搜索(待定…)

  • resnet50 模型召回

在这里插入图片描述

✨ 项目结构

1.tangseng 项目总体

tangseng/
├── app                   // 各个微服务
│   ├── favorite          // 收藏夹
│   ├── gateway           // 网关
│   ├── index_platform    // 索引平台
│   ├── mapreduce         // mapreduce 服务(已弃用)
│   ├── gateway           // 网关
│   ├── search_engine     // 搜索微服务(文本)
│   ├── search_vector     // 向量搜索微服务(图片+向量)
│   └── user              // 用户模块微服务
├── bin                   // 编译后的二进制文件模块
├── config                // 配置文件
├── consts                // 定义的常量
├── doc                   // 接口文档
├── idl                   // protoc文件
│   └── pb                // 放置生成的pb文件
├── loading               // 全局的loading,各个微服务都可以使用的工具
├── logs                  // 放置打印日志模块
├── pkg                   // 各种包
│   ├── bloom_filter      // 布隆过滤器
│   ├── clone             // 复制context,防止context cancel
│   ├── ctl               // 用户信息相关
│   ├── discovery         // etcd服务注册、keep-alive、获取服务信息等等
│   ├── fileutils         // 文件操作相关
│   ├── es                // es 模块
│   ├── jwt               // jwt鉴权
│   ├── kfk               // kafka 生产与消费
│   ├── logger            // 日志
│   ├── mapreduce         // mapreduce服务
│   ├── res               // 统一response接口返回
│   ├── retry             // 重试函数
│   ├── timeutil          // 时间处理相关
│   ├── trie              // 前缀树
│   ├── util              // 各种工具、处理时间、处理字符串等等..
│   └── wrappers          // 熔断
├── repository            // 放置打印日志模块
│   ├── mysql             // mysql 全局数据库
│   ├── redis             // redis 全局数据库
│   └── vector            // 向量数据库
└── types                 // 定义各种结构体

2.gateway 网关部分

gateway/
├── cmd                   // 启动入口
├── internal              // 业务逻辑(不对外暴露)
│   ├── handler           // 视图层
│   └── service           // 服务层
│       └── pb            // 放置生成的pb文件
├── logs                  // 放置打印日志模块
├── middleware            // 中间件
├── routes                // http 路由模块
└── rpc                   // rpc 调用

3.user && favorite 用户与收藏夹模块

user/
├── cmd                   // 启动入口
└── internal              // 业务逻辑(不对外暴露)
    ├── service           // 业务服务
    └── repository        // 持久层
        └── db            // db模块
            ├── dao       // 对数据库进行操作
            └── model     // 定义数据库的模型

4. index platform索引平台

seach-engine/
├── analyzer              // 分词器
├── cmd                   // 启动入口
├── consts                // 放置常量
├── crawl                 // 分布式爬虫
├── input_data            // csv文件(爬虫未实现)
├── respository           // 存储信息
│   ├── spark             // spark 存储,后续支持...
│   └── storage           // boltdb 存储(后续迁到spark)
├── service               // 服务
└── trie                  // 存放trie树

5.search-engine 搜索引擎模块

seach-engine/
├── analyzer              // 分词器
├── cmd                   // 启动入口
├── data                  // 数据层
├── ranking               // 排序器
├── respository           // 存储信息
│   ├── spark             // spark 存储,后续支持...
│   └── storage           // boltdb 存储(后续迁到spark)
├── service               // 服务
├── test                  // 测试文件
└── types                 // 定义的结构体

这里只是对tangseng的简单介绍而已~,具体可以查看github链接 tangseng搜索引擎

另外lotusdblabs 社区也开源了一个 lotusearch 搜索引擎,有兴趣同学可以瞅瞅~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1235785.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SPASS-指数平滑法

基本概念及统计原理 基本概念 指数平滑法的思想来源于对移动平均预测法的改进。指数平滑法的思想是以无穷大为宽度,各历史值的权重随时间的推移呈指数衰减,这样就解决了移动平均的两个难题。 统计原理 简单模型 Holt线性趋势模型 案例 为了研究上海市…

基于SSM的网络财务管理系统设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

Java Finalization‘s Memory-Retention Issues 及Reference类解析

引言 《Effective Java Programming Language Guide》 一书中强烈建议不要使用java的finalize()方法去做对象消亡前的清理。因为jvm调用finalize()方法的时机并不确定,容易导致Memory-Retention Issues。通俗点讲就是内存没办法及时回收。 详细的见oracle的官方说明…

[SCTF 2021]rceme

文章目录 前置知识可变参数绕过create_function注入无字母数字RCE动态链接库so绕过disable_functions利用php原生类进行文件读取 解题过程 前置知识 可变参数绕过 PHP 在用户自定义函数中支持可变数量的参数列表。在 PHP 5.6 及以上的版本中,由 … 语法实现&#x…

axios 请求合集

post 请求 请求负载请求参数(Request Payload) import axios from axios import qs from query-stringexport function getRoles(data){return axios.post(目标地址,data,{headers:{Content-Type: application/json,},}) }表单请求参数(Form…

场景驱动的 AI 体验设计:如何让智能 IDE 赋能遗留系统重写

作为 AutoDev 的核心开发,我们不仅在不断丰富 AutoDev 的功能以满足不同公司的定制需求,还在与各种团队进行持续交流。在处理遗留系统时,我们发现程序员们日常工作中需要面对大量使用过时技术、基础设施混乱的系统。 在这个背景下&#xff0c…

云计算:开辟数字时代的无限可能

云计算是一项革命性的技术,为企业和个人提供了灵活、可扩展和高效的计算资源。本文将介绍云计算的概念、架构和优势,并探讨其在数字化时代的重要性和未来发展趋势。 引言 随着信息技术的日新月异和数字化转型的浪潮席卷全球,云计算作为一种颠…

OpenLDAP配置web管理界面PhpLDAPAdmin服务-centos9stream

之前已经发了一篇关于centos9下面配置openldap多主高可用集群的内容,不会配置ldap集群的请参考:服务器集群配置LDAP统一认证高可用集群(配置tsl安全链接)-centos9stream-openldap2.6.2-CSDN博客 这里跟着前篇文章详细说明如何配置…

【教程】cpp转python Nanobind 实践 加速轻量版 pythonbind11

主要是尝试一下把c这边的函数封装打包给python用,选择nanobind的原因是:1. 优化速度快,2. 生成二进制包小,不过pythonbind11是更为广泛知道的,nanobind也是pythonbind11作者后续做的,可以查看作者写的 why …

重生之我是一名程序员 37

哈喽啊大家晚上好! 今天呢给大家带来一个烧脑的知识——C语言中的栈溢出问题。那什么是栈溢出呢?栈溢出指的是当程序在执行函数调用时,为了保护函数的局部变量和返回地址,将这些数据存储在栈中。如果函数在函数调用时使用了过多的…

基于SSM的进销存管理系统设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

letcode::最小栈

最小栈 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶部的元素。…

Mybatis系列之 parameterMap 弃用了

我 | 在这里 🕵️ 读书 | 长沙 ⭐软件工程 ⭐ 本科 🏠 工作 | 广州 ⭐ Java 全栈开发(软件工程师) 🎃 爱好 | 研究技术、旅游、阅读、运动、喜欢流行歌曲 🏷️ 标签 | 男 自律狂人 目标明确 责任心强 ✈️公…

nginx-编译安装-基础指令-信号

nginx 的编译与安装 nginx目录介绍 如果我们需要整合第三方模块,需要自己编译然此模块编译到nginx里面。apt和yum的安装只具有常用的基础功能。 下载nginx wget http://nginx.org/download/nginx-1.14.0.tar.gz/auto 目录 Changes 描述了一每个版本提供了那些特…

leetcode:环形链表

题目描述 题目链接:141. 环形链表 - 力扣(LeetCode) 题目分析 我们先了解一个知识:循环链表 尾结点不指向NULL,指向头就是循环链表 那么带环链表就意味着尾结点的next可以指向链表的任意一个结点,甚至可…

2024年测试工程师必看系列之Requests_模块_知识点总结

【文章末尾给大家留下大量的福利喔】 1,导入requests模块 get请求: url host https://www.baidu.com/s headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.…

Java --- JVM之垃圾回收相关知识概念

目录 一、System.gc() 二、内存溢出与内存泄漏 2.1、内存溢出 2.2、内存泄漏 三、Stop the world 四、垃圾回收的并行与并发 4.1、并发 4.2、并行 4.3、并行 vs 并发 4.4、垃圾回收的并发与并行 五、安全点与安全区域 5.1、安全点 5.2、安全区域 六、引用 6.1…

开发上门洗衣洗鞋小程序都需要考虑哪些经营场景

互联网的高速发展让很多行业都转变了传统的服务模式,很多需要到店的服务都提供了上门的服务方式,洗护行业也是如此,越来越多的城市都开始流行上门洗衣洗鞋,要做上门的服务模式的话,就需要有一个小程序为载体&#xff0…

点击这里,获取数据治理加速器!

数据管理员:又双叒叕…盘一遍数据,这种工作究竟还要重复多少次?! • 上上个月,发现数据有些问题,我把数据盘了一遍,梳理完数据的关联表才定位到问题; • 上个月,进行数据…