拥抱 Elasticsearch:给 TiDB 插上全文检索的翅膀

作者介绍:孙晓光,知乎技术平台负责人,与薛宁(@Inke)、黄梦龙(@PingCAP)、冯博(@知乎)组队参加了 TiDB Hackathon 2019,他们的项目 TiSearch 获得了 CTO 特别奖。

“搜索”是大家在使用各种 APP 中非常重要的一个行为,对于知乎这样以海量优质内容为特色的产品来说,借助搜索帮助用户准确、快速地触达想要寻找的内容更是至关重要。而“全文检索”则是隐藏在简单的搜索框背后不可或缺的一项基本能力。

当前我们正逐步将越来越多的业务数据向 TiDB 迁移,目前在 TiDB 上我们只能使用 SQL Like 对内容进行简单的检索。但即便不考虑性能问题,SQL Like 仍然无法实现一些在搜索场景下常见的信息检索需求,例如下图所示的几种场景,单纯使用 Like 会导致查询到有歧义的结果或满足搜索条件的结果无法返回。

当前 TiDB 全文检索能力的缺失,使得我们依旧需要使用传统的方式将数据同步到搜索引擎,在过程中需要根据业务特点做大量繁琐的数据流水线工作维护业务数据的全文索引。

为了减少这样的重复劳动,在今年 TiDB Hackathon 中我们尝试为 TiDB 引入“全文检索”功能,为存储在 TiDB 中的文本数据提供随时随地搜索的能力。以下是最终的效果展示:

方案设计

要在短短一天的 Hackathon 时间内让 TiDB 中支持全文检索,难度还是非常大的,于是在最开始的时候,我们就选择了一条非常稳妥的设计方案——采用整合 Elasticsearch(后续简称 ES)的方式为 TiDB 扩展全文检索能力。

为什么选择 ES?一方面我们可以充分利用 ES 成熟的生态直接获得中文分词和 query 理解能力。另外生态融合所带来的强强联合效应,也符合 TiDB 崇尚社区合作的价值观。

考虑到工作量,对于全文索引的数据同步方案我们没有采用 TiKV Raft Learner 机制,也没有使用 TiDB Binlog 的方式进行同步,而是采用了最保守的双写机制直接在 TiDB 的写入流程中增加了全文索引更新的流程。

架构如上图所示,TiDB 作为 ES 和 TiKV 之间的桥梁,所有同 ES 的交互操作都嵌入在 TiDB 内部直接完成。

在 TiDB 内部,我们将表额外增加了支持 FULLTEXT 索引的元数据记录,并且在 ES 上面创建了对应的索引和 Mapping,对于 FULLTEXT 索引中的每一个文本列,我们都将它添加到 Mapping 中并指定好需要的 Analyzer,这样就可以在索引上对这些文本列进行全文检索了。

在 ES 的索引的帮助下,我们只需要在写入数据或者对数据进行更新的时候在 ES 的索引上进行对应的更新操作,就保持 TiDB 和 ES 数据的同步。而对于查询,现在流程如下:

  1. TiDB 解析用户发送的 Query。
  2. 如果发现该 Query 带有全文检索的 hint,TiDB 则会将请求发给 ES,使用 ES 索引查询到记录主键。
  3. TiDB 拿到所有记录主键之后,在 TiDB 内部获取实际的数据,完成最终的数据读取。
  4. TiDB 将结果返回给用户。

未来规划

Hackathon 短短的 24 小时,让我们验证了整合 TiDB 和 ES 的可能性,当然,我们不会满足于这套双写的方案。未来我们会参考 TiFlash,基于 Raft Learner 实时将数据变更同步给 ES,将 TiDB 打造成一个真正的能支持实时全文检索的 HTAP 数据库,如下图所示:

使用 Raft Learner,对于写流程:

  • TiDB 会直接将数据写给底层的 TiKV。
  • TiKV 会通过 Raft 协议将写入数据同步到 ES Learner 节点,通过该 Learner 节点写入到 ES。

对于读流程:

  • TiDB 解析到用户发过来的 Query 带有全文检索的 hint。
  • TiDB 将请求发给 ES Learner 节点。
  • ES Learner 节点首先通过 Raft 协议来确保节点上面有了最新的数据,并且最新的数据已经写入到 ES。
  • ES Learner 节点通过 ES 的索引读取到对应的记录主键,返回给 TiDB。
  • TiDB 使用记录主键获取到完整的数据,并返回给客户端。

可以看到,相比于之前让 TiDB 双写到 ES 和 TiKV 的方案,在写入上面,TiDB 并不需要跟 ES 进行交互,而在读取方面,通过 Raft 协议,TiDB 也能保证从 ES 读取到最新的数据,保证了数据的一致性。

当然,要实现上面的功能,我们也需要更多的帮助,我们希望能够跟社区小伙伴一起,一起完成这个非常酷的特性。

写在最后

得益于个人在知乎搜索团队的短暂经历,对搜索的价值和业务接入搜索的工作量有过很直观的感受。在越来越多的数据存在于 TiDB 的时代,随时可以对业务数据的某些字段进行全文检索的价值很大。这个价值不但体现在能够实现以往 SQL 难以做好的一些事情,更大的意义是将全文检索的能力以接近 free 的方式提供给业务方,给用户搭建起一座连接关系型数据库与搜索引擎的桥梁,做到随时写入,随时搜索。如果你也有这方面的想法,欢迎邮件联系我 sunxiaoguang@zhihu.com。

原文阅读:https://pingcap.com/blog-cn/fulltext-search-with-tidb-and-elasticsearch/

拥抱 Elasticsearch:给 TiDB 插上全文检索的翅膀相关推荐

  1. 如何给TiDB插上全文检索的翅膀

    "搜索"是内容类App产品非常重要的一个功能,"全文检索"是支持它不可或缺的一项基本能力. 目前业界很多公司产品的业务数据已经向 TiDB 迁移了,但目前在 T ...

  2. 时序数据库(TSDB)-为万物互联插上一双翅膀

    本文由  网易云 发布. 时序数据库(TSDB)是一种特定类型的数据库,主要用来存储时序数据.随着5G技术的不断成熟,物联网技术将会使得万物互联.物联网时代之前只有手机.电脑可以联网,以后所有设备都会 ...

  3. 视频监控为校园安全插上“隐形的翅膀”

    随着公众社会安全防范意识的提高,安防系统慢慢在各种公共场合普及.而我国教育事业的发展,高校的规模越来越大,学生人数不断增多,校区开放程度和后勤服务社会化程度亦越来越高,学校的管理工作和安全保安工作面临 ...

  4. 华为云DevCloud为虚拟仿真插上互联网的翅膀

    华为云DevCloud为虚拟仿真插上互联网的翅膀 两三年前,虚拟仿真或者说VR,火得一塌糊涂,火得不真实.又在无人察觉中,平静地落下帷幕,这个行业开始回归本质.原本专业性极强的领域,以游戏为突破口.以 ...

  5. 仿真技术为“工业 4.0”插上想象的翅膀

    "智能+"时代来临 新兴技术正在叩响行业转型之门 首当其冲的当属承载工业之魂的制造业 面向工业4.0 制造业应该如何打破低端锁定困局 加快融合智能制造步伐呢? 对于现代制造企业来说 ...

  6. 未来的计算机绘画图片,电脑绘画——为想象力插上科技的翅膀 二十中附校科技社团电脑绘画作品展...

    原标题:电脑绘画--为想象力插上科技的翅膀 二十中附校科技社团电脑绘画作品展 二十中附校电脑绘画卓越能力课程开展至今有近2年时间了.课程帮助学生认识绘画工具和软件.培养良好的绘画习惯.提高绘画和艺术创 ...

  7. 为有梦青年插上助力的翅膀 魅族开发者大赛取得圆满成功

    2016年11月19日,在北京京都信苑饭店,"魅族技术开放日第六期暨魅族开放平台开发者大赛颁奖礼"在SDCC2016中国软件开发者大会分会场盛大召开,本次活动不仅邀请了业界技术大咖 ...

  8. 让传统的振弦传感器插上信息化的翅膀---VM系列读数模块

    让传统的振弦传感器插上信息化的翅膀---VM系列读数模块 产品主要应用于振弦传感器信号转换.自动化监测.岩土工程监测.地质灾害等领域. 关键词:安全监测,自动化,振弦传感器,测量模块 作为国内领先的从 ...

  9. 哈尔滨市平房区云计算助力 为创城插上智慧的翅膀

    随着创建文明城市工作的不断深入,哈尔滨市平房区智慧城市建设的成果,不断地为创城所用,创城插上了智慧的翅膀,在文明的天空里,展现出动人的魅力.目前,平房区出资建设主要街路的高清监控摄像头152个,新建1 ...

最新文章

  1. linux中去掉^M的方法
  2. postfix邮件系统经典退信
  3. linux 信号处理实验,linux下信号处理
  4. Flutter入坑分享
  5. 混淆视听的感脚(二)
  6. matlab绘制贝叶斯曲线,Matlab建立SVM,KNN和朴素贝叶斯模型分类绘制ROC曲线
  7. Macaron的注入struct
  8. [转帖]Cookies和Session的区别和理解
  9. Tcpdump的详细用法
  10. php超链接怎么写,怎么给一个PHP密码访问页面加超链接
  11. 在计算机设备中 麦克风属于( ),计算机一级考试基础及MSOffice应用单选真题
  12. php redis菜鸟教程,PHP 使用 Redis
  13. MATLAB+三对角矩阵
  14. 张飞的流水帐(无厘头式的搞笑)【
  15. 全美“50大好差事” 软件工程师排名第一
  16. 大写金额换算器iOS版源代码
  17. 同样是90后别人家的孩子已经是年薪百万算法工程师,而你呢?
  18. 【mindspore】mindspore实现手写数字识别
  19. 企业微信-自建应用一:介绍与创建
  20. [R语言]R包的安装帮助获取

热门文章

  1. Regsvr32.exe 的用法
  2. Magento教程 11:Inline Translation前台改文
  3. 实现动态验证码的思路
  4. Python3.0 新特性
  5. 增加 magento top_menu菜单
  6. 嵌入式知识概要(1)
  7. LeetCode 637. Average of Levels in Binary Tree
  8. 【AI视野·今日CV 计算机视觉论文速览 第173期】Wed, 25 Dec 2019
  9. 【今日CV 视觉论文速览】30 Nov 2018
  10. 虚拟环境的常用命令 virtualenv命令