腾讯全文检索引擎 wwsearch 正式开源

news2024/10/10 14:16:23

背景

企业微信作为典型企业服务系统,其众多企业级应用都需要全文检索能力,包括员工通讯录、企业邮箱、审批、汇报、企业CRM、企业素材、互联圈子等。下图是一个典型的邮件检索场景。

由于过去几年业务发展迅速,后台检索架构面临挑战:

1. 系统在亿级用户,xxx万企业下,如何高效+实时地检索个人企业内数据和所在企业全局数据。

2. 业务模型众多,如何满足检索条件/功能多样化需求。

3. 数据量庞大,检索文本几十TB,如何节约成本。

业界有被广泛使用的开源全文检索引擎,比如:lucene、sphinx等。它们适用于站内检索的场景。而在海量用户、大规模数据量的实时检索场景下,存在明显缺点:

1. 无法支持细粒度切分索引,只能对全局数据构建索引 ,检索过程需要过滤冗余数据。

2. 不支持实时检索,有几十秒~分钟级延迟。

3. 实际部署机型要求高,需要大内存机型才能支撑T级别的数据存储。

针对已有方案的不足,并结合企业级应用场景,我们重新设计和实现一套通用的全文检索引擎wwsearch。

自研全文检索引擎

wwsearch为海量用户下的全文快速检索而设计,底层支持可插拔的lsm tree存储引擎,具备支持按用户的亿级分表、低延时、高效更新、索引压缩、功能丰富、内存消耗低等特点。

目前覆盖企业微信所有在线检索场景, 最大业务场景有300亿+条记录,索引词项万亿+,存储容量几十TB。在大规模数据下,服务运行稳定,可以为业务增长提供稳定有力保障!

wwsearch有丰富的功能,可灵活支持业务场景:

1. 支持等值、前缀、模糊匹配,支持And、Or条件组合。

2. 实时增删查改。

3. 支持后置过滤,包括等值、数值范围、数组元素查找、字符串模糊匹配。

4. 支持多条件排序,类似order by语义。

5. 可扩展功能,包括聚合功能(sum/avg...)、文档打分。

高效索引更新

企业级应用相关的数据通常需要经过多次流转,才能达到最终状态,比如审批业务。这意味着,检索系统的数据写入后也需要部分更新。

开源检索引擎实现是基于文档粒度对索引进行增删,更新是一次删除和全量插入过程,无法高效支持部分更新。

wwsearch的实现和开源不同,索引的增删是基于词级别的,粒度更细。主要原理:

1. 引擎记录写入文档的分词列表,更新时,通过对比更新前后的分词列表,可以知道应该插入哪些词、删除哪些词。

2. 检索一个词的倒排列表时,会读取该词多个倒排列表,并按优先级对倒排列表归并,时间上后写的倒排列表优先级更高。

3. 倒排列表内被删除的DocID会随着lsm tree文件的合并(Compact),会被逐渐淘汰。

wwsearch以倒排列表为单位对索引进行增删改的方案,优点如下:

1. 实时读写,写入即可检索。

2. 更新友好,高效支持部分更新。

支持亿级分表

开源检索引擎对全局数据构建索引,每次检索需在全局索引中检索结果,这种做法存在缺点:

1. 用户或企业只检索自身数据,在多用户场景下,检索效率低。

2. 大规模数据情况下,无法实时响应用户请求。

通过支持细粒度分表的能力,wwsearch可以很好地解决这个问题。原理是:利用lsm tree全局有序能力,通过对正向索引、倒排索引的数据key增加特定Prefix的方式,来支持亿级分表的能力。由于底层存储采用lsm tree结构存储,通过共享key前缀方式,我们可以忽略不计这个Prefix增加的存储消耗。

wwsearch支持细粒度分表,优点如下:

1. 检索性能最优、请求延时低。

2. 无需过滤冗余数据,资源消耗最小,服务能保持很强的稳定性。

高效全文模糊匹配

模糊匹配是在有限信息情况下找到匹配的文本。这是一个比较常见的功能需求,比如用户检索一个用户的手机号,输入前几个数字后,希望能尽快补全,又比如输入航班号数字部分,检索出完整航班号信息。

开源实现的不同方案:

1. 对词进行细粒度切分,一个长度为N个字符的词,从该词切分出连续2个字、3个字... 一直到N个字的的词。这种方法缺点是有O(N^2)个词展开。

2. 维护词典,在模糊匹配时,遍历词典找到满足匹配的词。这种方法缺点是匹配效率差,词典过大情况下,无法实时返回结果。

wwsearch用一种空间相对节省且检索高效的新方案:词按后缀展开+lsm key/value索引按词典排序+前缀匹配检索,词展开仅O(N),检索效率优。通过例子描述,假设有记录DocID = 1,name = Michael。我们把name这个词按后缀展开后,以下词的倒排列表都会插入这个DocID。检索 chae 时,通过前缀匹配找到 chael 这个词的倒排列表,并把这个DocID返回。

词典:

ael:1

chael:1 <--- 定位到这里

el: 1

hael:1

ichael:1

Michael:1

高效过滤排序

部分业务场景里,单纯按关键词检索还不能满足用户需求:

1. 命中结果需要特定排序,比如有些场景需要按时间倒序排列,有些场景需要按点击数再按时间倒序排列。

2. 命中结果包含多余数据,还需要进行二次过滤,比如用户想检索处于申请中的审批单据。

这些需求需要读取排序列或者过滤列的属性值,行存和列存各有优缺点:

1. 属性混合存储:这种方式无差别的把所有属性混合为一行记录,打包存储在文件里。好处是没有冗余存储,读取一次就可获得一条记录所有的列值。设想一个场景,一条文本原文大小6 KB,检索某个词命中1万条记录,需要排序返回。以此推算,对1万条记录排序一次,需要读取60MB数据。

2. 属性按列存储:这种方式适用于宽列但列值比较稀疏的数据场景,可以按列独立操作。也有一些缺点,写入时需要写多列,读取时也要按排序或过滤情况读取多列。

 

过滤、排序的列通常都是数值类数据,如果能一次写入或读取应该是最优的。综上,wwsearch引擎采用部分属性混合存储的方案。优点:读取次数少,只需一次读取即可得到所需属性,配合批量读取,可以有效降低IO消耗。

索引压缩

有效地降低检索系统存储容量消耗,可以降低机器运营成本。wwsearch引擎在以下多个方面对存储消耗进行针对性优化。

1. 支持覆盖写功能。针对文本只写不改的场景,比如单据内容、邮件等,写入倒排索引后,正向索引不会存储分词后的词列表。通过这种接口写入场景,可以大幅度减少正向信息存储带来的消耗。

2. 支持倒排列表压缩。倒排列表存储由三部分组成:头部(Header)、倒排列表(DocIDList)、删除列表(DeleteList)。头部记录编码版本,定长为1字节。倒排列表按DocID倒序,第一个是Base,后续每个值记录与前一个DocID差值,用varint编码。删除列表记录有删除标记的DocID位置(相对于倒排列表),按位置升序,第一个是Base,后续每个值记录与前一个位置差值,用varint编码。

3. 支持主键映射。实际情况下业务主键通常是字符串,难以要求有64位无符号整数的主键,即使存在,其DocID在随机生成情况下,倒排列表的压缩方案就无法发挥很大作用。通过主键映射,任意业务主键可映射到一个唯一的64位无符号整数,从0开始,严格递增,映射可逆。

wwsearch开源

现在,腾讯把wwsearch开源。我们乐于开源共享,希望wwsearch能被有相同业务场景需求的开发者使用,解决大家在全文检索场景遇到的类似问题。

wwsearch 正式开源

Github 开源地址:

https://github.com/Tencent/wwsearch

(点击文末阅读原文直接访问)

请给 wwsearch 一个 Star !

欢迎提出你的 issue 和 PR!

wwsearch 国内镜像地址:

https://git.code.tencent.com/Tencent_Open_Source/wwsearch

(登录后才能访问公开项目)

 

腾讯工蜂源码系统为开源开发者提供完整、最新的腾讯开源项目国内镜像

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

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

相关文章

学霸都在用的秘密武器!盘点3款语音识别转文字软件,学习力MAX!

现在科技这么发达&#xff0c;手写笔记好像越来越不流行了。在这个什么都讲究快的时代&#xff0c;怎么又快又好地记下重要信息&#xff0c;是大家都想要的。正好&#xff0c;现在市面上有很多能把语音转换成文字的工具&#xff0c;它们特别有用&#xff0c;正在慢慢改变我们学…

pipe和pipefd

Linux 中 pipe 的详细介绍 在 Linux 中&#xff0c;pipe 是一个系统调用&#xff0c;用于创建一个管道&#xff0c;这是一种用于进程间通信&#xff08;IPC&#xff09;的机制。管道允许两个进程之间进行单向数据传输&#xff0c;通常是一个进程向管道写入数据&#xff0c;而另…

【机器学习】金融预测 —— 风险管理与股市预测

我的主页&#xff1a;2的n次方_ 在金融领域&#xff0c;机器学习&#xff08;ML&#xff09;已经成为了不可或缺的工具。金融预测&#xff0c;尤其是风险管理和股市预测&#xff0c;涉及海量数据和复杂模式的分析&#xff0c;而这些正是机器学习擅长处理的领域。通过分析历…

什么是矩阵系统,怎么选择矩阵系统,怎么oem贴牌,怎么源码搭建

一、架构设计方面 采用微服务架构 将矩阵系统拆分为多个小型的、独立的服务模块。每个微服务专注于特定的业务功能&#xff0c;如用户管理、内容发布、数据分析等。这样可以独立地开发、部署和扩展每个服务&#xff0c;而不会影响整个系统。例如&#xff0c;当用户量增加导致用…

机器学习与神经网络荣膺诺贝尔物理学奖:跨学科融合的时代来临

近日&#xff0c;2024年诺贝尔物理学奖颁发给了机器学习与神经网络领域的研究者&#xff0c;这一消息犹如一颗重磅炸弹&#xff0c;迅速在全球学术界和科技界引起了轰动和热议。这是诺贝尔物理学奖首次将桂冠授予计算机科学领域的研究者&#xff0c;标志着物理学与计算机科学的…

dvwa:文件包含、文件上传

文件包含 本地文件包含&#xff08;敏感信息泄露&#xff09;和远程文件包含&#xff08;命令执行&#xff09; 本地文件包含一般包含一些本地的敏感文件&#xff0c;如&#xff1a;/etc/passwd或/etc/shadow等 远程文件包含能使得服务器代码执行&#xff0c;如包含黑客vps的…

【纯前端实现xlsx的解析并处理成table需要的格式】

概要 xlsx纯前端导入并解析成json 整体架构流程 xlsx导入并解析成json&#xff0c;并与table中的数据进行对比&#xff0c;根据唯一标识更新对应数据项 技术名词解释 vue2xlsx 技术细节 首先下载xlsx依赖 npm install xlsx --save然后在需要导入xlsx的地方 这里主要用in…

基于模型的强化学习方法4大类灌水范式

我们都知道基于模型的强化学习&#xff0c;就是从数据中学一个环境模型。 举个例子&#xff0c;我们要控制一个马达&#xff0c;输入就是电流&#xff0c;输出就是转速。无模型强化学习就是随机采样&#xff0c;然后从数据中直接学习输入到输出的影射&#xff0c;研究重心在如…

【AAOS】Android Automotive 10模拟器源码下载及编译

源码下载 repo init -u https://android.googlesource.com/platform/manifest -b android-10.0.0_r47 repo sync -c --no-tags --no-clone-bundle 源码编译 source build/envsetup.sh lunch aosp_car_x86_64-userdebug make -j8 运行效果 emualtor Cluster Home Map All …

大模型部署-​Ollama+WebUI

Ollama&#xff08;安装包和安装文档文末领取&#xff01;&#xff09; Ollama 简介 主要特点&#xff1a; 易于使用&#xff1a;它提供了一个简洁的界面和命令行工具&#xff0c;使得用户可以方便地管理和运行不同的大语言模型。 多种模型支持&#xff1a;可以运行多种开源…

ip地址换网就不一样了吗?ip地址会因什么变动而变化

在当今数字化时代&#xff0c;IP地址作为网络设备的唯一标识&#xff0c;扮演着至关重要的角色。然而&#xff0c;对于许多用户来说&#xff0c;IP地址的变动仍然是一个充满疑惑的话题。那么&#xff0c;IP地址换网就真的不一样了吗&#xff1f;本文将深入探讨IP地址变动的因素…

力扣1~10题

题1&#xff08;简单&#xff09;. 思路&#xff1a; 因为时间复杂度小于n^2,所以不能双for遍历&#xff0c;怎么优化&#xff1f; 这里采用一个键值对的形式&#xff0c;存储nums离target的间隔和它的下标&#xff0c;只要n&#xff0c;然后再遍历nums有没有刚好是这个距离的就…

SwiftUI 在 iOS 18 中的 ForEach 点击手势逻辑发生改变的解决

概述 原本在 iOS 17 中运行良好的 SwiftUI 代码突然在 iOS 18 无法正常工作了&#xff0c;具体表现为原来视图中的的点击手势无法响应。 这是怎么回事呢&#xff1f; 且看分解&#xff01;Let’s go&#xff01;&#xff01;&#xff01;&#x1f609; 问题现象 从下面的演示…

自动驾驶系列—GPS技术在自动驾驶中的应用与挑战:全面解析

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

海量案例!点击洞察2024年工业数字孪生发展趋势

如果能在虚拟世界中完美复制出现实中的物体或系统&#xff0c;将会带来怎样的变革&#xff1f;数字孪生正是这样一种神奇的存在——它将物理世界中的设备或系统转化为精确的虚拟模型&#xff0c;通过实时数据的采集、分析与应用&#xff0c;创造出一个与“物理实体”完全对应的…

Apache DolphinScheduler-1.3.9源码分析(二)

引言 随着大数据的发展&#xff0c;任务调度系统成为了数据处理和管理中至关重要的部分。Apache DolphinScheduler 是一款优秀的开源分布式工作流调度平台&#xff0c;在大数据场景中得到广泛应用。 在本文中&#xff0c;我们将对 Apache DolphinScheduler 1.3.9 版本的源码进…

python安装第三方库的问题与解决方法

1 速度过慢 大部分第三方库都是在国外网站&#xff0c;如果直接使用pip install 包名&#xff0c;下载速度会很慢&#xff0c;这对一些大型包是很致命的&#xff0c;如果下载中断则需要重头再来。 解决方案&#xff1a;使用国内镜像&#xff08;如清华镜像下载&#xff09;&a…

Vue 脚手架学习

1.使用 Vue 脚手架 1.1 初始化脚手架 1.1.1 具体步骤 第一步&#xff08;仅第一次执行&#xff09;&#xff1a;全局安装vue/cli。 npm install -g vue/cli 第二步&#xff1a;切换到你要创建项目的目录&#xff0c;然后使用命令创建项目 vue create xxxx 第三步&#xff1a;启…

AI绘画Stable Diffusion XL优化终极指南!

前言 如何在自己的显卡上获得SDXL的最佳质量和性能&#xff0c;以及如何选择适当的优化方法和工具&#xff0c;这一让GenAI用户倍感困惑的问题&#xff0c;业内一直没有一份清晰而详尽的评测报告可供参考。直到全栈开发者Flix San出手。 在本文中&#xff0c;Flix介绍了相关SD…

9个热门.Net开源项目汇总!

今天盘点下9月份推荐的9个开源项目&#xff08;点击标题查看详情&#xff09;。 1、Pidgin&#xff1a;一个轻量级、快速且灵活的 C# 解析库 Pidgin是基于C#的开源项目&#xff0c;是一个解析组合器库&#xff0c;提供了一个高级别的声明性工具来构建解析器&#xff0c;使得编…