【Go语言实战】(26) 分布式搜索引擎
Tangseng 基于Go语言的搜索引擎
github地址:https://github.com/CocaineCong/tangseng
详细介绍地址:https://cocainecong.github.io/tangseng
这两周我也抽空录成视频发到B站的~ 本来应该10月份就要发了,结果一鸽就鸽到现在hhhh,有兴趣的同学也可留意一下~
项目大体框架
- gin作为http框架,grpc作为rpc框架,etcd作为服务发现。
- 总体服务分成
用户模块、收藏夹模块、索引平台、搜索引擎(文字模块)、搜索引擎(图片模块)。注册到etcd中,并进行服务发现。 - 分布式爬虫爬取数据,并发送到kafka集群中,再落库消费。现阶段使用数据集文本输入 (虽然爬虫还没写,但不妨碍我画饼…)
- 搜索引擎模块的文本搜索单独设立使用boltdb存储index,mapreduce+kafka集群加速索引构建并使用
roaring bitmap存储索引。 - 使用 trie tree 实现词条联想。
- 图片搜索使用ResNet50来进行向量化查询 + Milvus or Faiss 向量数据库的查询 (开始做了… DeepLearning也太难了…)。
- 支持多路召回,go中进行倒排索引召回,python进行向量召回。通过grpc调用连接,进行融合。
- 支持TF-IDF,BM25等等算法排序。
- 第三方容器纯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 搜索引擎,有兴趣同学可以瞅瞅~
相关文章:
【Go语言实战】(26) 分布式搜索引擎
Tangseng 基于Go语言的搜索引擎 github地址:https://github.com/CocaineCong/tangseng 详细介绍地址:https://cocainecong.github.io/tangseng 这两周我也抽空录成视频发到B站的~ 本来应该10月份就要发了,结果一鸽就鸽到现在hh…...
【理解ARM架构】不同方式点灯 | ARM架构简介 | 常见汇编指令 | C与汇编
🐱作者:一只大喵咪1201 🐱专栏:《理解ARM架构》 🔥格言:你只管努力,剩下的交给时间! 目录 🏀直接操作寄存器点亮LED灯🏀地址空间🏀ARM内部的寄存…...
JS服务端技术—Node.js知识点锦集
【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://blog.csdn.net/m0_69908381/article/details/134544523 出自【进步*于辰的博客】 接触Node.js挺长时间了,工作也经常使用…...
界面控件DevExpress WPF流程图组件,完美复制Visio UI!(一)
DevExpress WPF Diagram(流程图)控件帮助用户完美复制Microsoft Visio UI,并将信息丰富且组织良好的图表、流程图和组织图轻松合并到您的下一个WPF项目中。 P.S:DevExpress WPF拥有120个控件和库,将帮助您交付满足甚至…...
为什么选择B+树作为数据库索引结构?
背景 首先,来谈谈B树。为什么要使用B树?我们需要明白以下两个事实: 【事实1】 不同容量的存储器,访问速度差异悬殊。以磁盘和内存为例,访问磁盘的时间大概是ms级的,访问内存的时间大概是ns级的。有个形象…...
什么是神经网络(Neural Network,NN)
1 定义 神经网络是一种模拟人类大脑工作方式的计算模型,它是深度学习和机器学习领域的基础。神经网络由大量的节点(或称为“神经元”)组成,这些节点在网络中相互连接,可以处理复杂的数据输入,执行各种任务…...
15 Go的并发
概述 在上一节的内容中,我们介绍了Go的类型转换,包括:断言类型转换、显式类型转换、隐式类型转换、strconv包等。在本节中,我们将介绍Go的并发。Go语言以其强大的并发模型而闻名,其并发特性主要通过以下几个元素来实现…...
管理体系标准
管理体系标准 什么是管理体系? 管理体系是组织管理其业务的相互关联部分以实现其目标的方式。这些目标可能涉及许多不同的主题,包括产品或服务质量、运营效率、环境绩效、工作场所的健康和安全等等。 系统的复杂程度取决于每个组织的具体情况。对于某…...
【Java 进阶篇】揭秘 Jackson:Java 对象转 JSON 注解的魔法
嗨,亲爱的同学们!欢迎来到这篇关于 Jackson JSON 解析器中 Java 对象转 JSON 注解的详细解析指南。JSON(JavaScript Object Notation)是一种常用于数据交换的轻量级数据格式,而 Jackson 作为一款优秀的 JSON 解析库&am…...
②【Hash】Redis常用数据类型:Hash [使用手册]
个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ Redis Hash ②Redis Hash 操作命令汇总1. hset…...
十七、SpringAMQP
目录 一、SpringAMQP的介绍: 二、利用SpringAMQP实现HelloWorld中的基础消息队列功能 1、因为publisher和consumer服务都需要amqp依赖,因此这里把依赖直接放到父工程mq-demo中 2、编写yml文件 3、编写测试类,并进行测试 三、在consumer…...
Java虚拟机(JVM)的调优技巧和实战
JVM是Java应用程序的运行环境,它负责管理Java应用程序的内存分配、垃圾收集等重要任务。然而,JVM的默认设置并不总是适合所有应用程序,因此需要根据应用程序的需求进行调优。通过对JVM进行调优,可以大大提高Java应用程序的性能和可…...
idea中的sout、psvm快捷键输入,不要太好用了
目录 一、操作环境 二、psvm、sout 操作介绍 2.1 psvm,快捷生成main方法 2.2 sout,快捷生成打印方法 三、探索 psvm、sout 底层逻辑 一、操作环境 语言:Java 工具: 二、psvm、sout 操作介绍 2.1 psvm,快捷生成m…...
shell脚本字典创建遍历打印
解释: 代码块中包含了每个用法的详细解释 #!/bin/bash# 接收用户输入的两个数 echo "请输入第一个数:" read num1 echo "请输入第二个数:" read num2# 创建一个关联数组 declare -A dict1 declare -A dict2# 定义键和值…...
【设计模式】聊聊职责链模式
原理和实现 模板模式变化的是其中一个步骤,而责任链模式变化的是整个流程。 将请求的发送和接收解耦合,让多个接收对象有机会可以处理这个请求,形成一个链条。不同的处理器负责自己不同的职责。 定义接口 public interface Filter {/*** …...
【C++进阶之路】第五篇:哈希
文章目录 一、unordered系列关联式容器1.unordered_map(1)unordered_map的介绍(2)unordered_map的接口说明 2. unordered_set3.性能对比 二、底层结构1.哈希概念2.哈希冲突3.哈希函数4.哈希冲突解决(1)闭散…...
CentOS基Docker容器时区配置解决方案
配置Docker容器的时区对于确保应用程序正确处理日期和时间至关重要。当使用CentOS作为基础镜像时,可以通过以下两种方法配置时区: 方法一:在Dockerfile中设置时区 这种方法涉及在构建Docker镜像的过程中设置时区。 步骤 选择基础镜像&…...
探索 Material 3:全新设计系统和组件库的介绍
探索 Material 3:全新设计系统和组件库的介绍 一、Material 3 简介1.1 Material 3 的改进和更新1.2 Material 3 的优势特点 二、Material 3 主题使用2.1 使用 Material3 主题2.2 使用 Material3 主题颜色 三、Material 3 组件使用3.1 MaterialButton:支持…...
《多GPU大模型训练与微调手册》
全参数微调 Lora微调 PTuning微调 多GPU微调预备知识 1. 参数数据类型 torch.dtype 1.1 半精度 half-precision torch.float16:fp16 就是 float16,1个 sign(符号位),5个 exponent bits(指数位),10个 ma…...
【C++】const与类(const修饰函数的三种位置)
目录 const基本介绍 正文 前: 中: 后: 拷贝构造使用const 目录 const基本介绍 正文 前: 中: 后: 拷贝构造使用const const基本介绍 const 是 C 中的修饰符,用于声明常量或表示不可修改的对象、函数或成员函数。 我们已经了解了const基本用法,我们先进行…...
大模型时代,软件测试的“变”与“不变”
随着大语言模型技术的爆发式演进,软件测试领域正经历一场前所未有的深度变革。从传统的脚本化验证到如今的智能体驱动测试,大模型不仅重塑了测试工具链,更在根本上动摇了沿用数十年的测试方法论。对于广大软件测试从业者而言,我们…...
智慧树刷课插件终极指南:如何用自动化技术节省90%学习时间
智慧树刷课插件终极指南:如何用自动化技术节省90%学习时间 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 还在为智慧树平台上的重复点击操作烦恼吗&#x…...
如何用开源甘特图软件GanttProject高效管理复杂项目:终极免费指南
如何用开源甘特图软件GanttProject高效管理复杂项目:终极免费指南 【免费下载链接】ganttproject Official GanttProject repository. 项目地址: https://gitcode.com/gh_mirrors/ga/ganttproject 还在为昂贵的项目管理软件发愁吗?想找一款功能强…...
基于MCP协议构建Jira智能助手:连接AI与项目管理的实践指南
1. 项目概述:连接Jira与AI的桥梁最近在折腾AI应用开发,特别是想把手头的一些项目管理流程自动化。我发现很多团队都在用Jira管理任务,但每次想通过AI助手(比如Claude、Cursor)查询项目进度、创建Issue或者更新状态时&a…...
告别地图偏移!OpenLayers 6/7 中正确配置 CGCS2000 (EPSG:4490) 对接天地图的完整指南
告别地图偏移!OpenLayers 6/7 中正确配置 CGCS2000 (EPSG:4490) 对接天地图的完整指南 在 GIS 开发领域,坐标系的选择和配置是项目成功的关键因素之一。对于国内开发者而言,国家 2000 大地坐标系(CGCS2000,EPSG:4490&a…...
32Gb NAND闪存供应趋紧:产业升级下的供需失衡与应对策略
1. 市场动态深度解析:当32Gb NAND闪存供应趋紧最近和几个做消费电子和工控方案的朋友聊天,大家不约而同地都在吐槽同一件事:一些老型号、小容量的存储芯片,不仅交期拉得老长,价格还蹭蹭往上涨。这感觉就像你去五金店买…...
Ripes终极指南:掌握RISC-V处理器可视化仿真的完整教程
Ripes终极指南:掌握RISC-V处理器可视化仿真的完整教程 【免费下载链接】Ripes A graphical processor simulator and assembly editor for the RISC-V ISA 项目地址: https://gitcode.com/gh_mirrors/ri/Ripes 想要深入理解计算机体系结构却苦于抽象概念难以…...
从零搭建一个低成本CWDM网络:手把手教你用ADOP光模块搞定企业分支互联
从零搭建一个低成本CWDM网络:手把手教你用ADOP光模块搞定企业分支互联 当企业需要连接分散在不同地理位置的办公点时,传统专线方案的高昂成本往往令人望而却步。而CWDM技术以其经济实惠的特性,成为中小企业分支互联的理想选择。本文将带你一步…...
ComfyUI-Florence2完整指南:5分钟解锁微软视觉语言模型的终极力量
ComfyUI-Florence2完整指南:5分钟解锁微软视觉语言模型的终极力量 【免费下载链接】ComfyUI-Florence2 Inference Microsoft Florence2 VLM 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-Florence2 如果你正在寻找一款能够一站式解决所有视觉AI任务…...
OpenClaw 2.6.6 Windows 部署教程|拦截与报错一站式解决
OpenClaw 2.6.6 Windows 一键部署教程|零基础搭建本地 AI 智能助手 OpenClaw(小龙虾)是一款可在本地环境运行的 AI 智能操作工具,能够通过自然语言指令完成电脑操控、文件管理、办公自动化、浏览器操作、数据整理等任务。全程可视…...
