极客视点
极客时间编辑部
极客时间编辑部
113242 人已学习
免费领取
课程目录
已完结/共 3766 讲
2020年09月 (90讲)
时长 05:33
2020年08月 (93讲)
2020年07月 (93讲)
时长 05:51
2020年06月 (90讲)
2020年05月 (93讲)
2020年04月 (90讲)
2020年03月 (92讲)
时长 04:14
2020年02月 (87讲)
2020年01月 (91讲)
时长 00:00
2019年12月 (93讲)
2019年11月 (89讲)
2019年10月 (92讲)
2019年09月 (90讲)
时长 00:00
2019年08月 (91讲)
2019年07月 (92讲)
时长 03:45
2019年06月 (90讲)
2019年05月 (99讲)
2019年04月 (114讲)
2019年03月 (122讲)
2019年02月 (102讲)
2019年01月 (104讲)
2018年12月 (98讲)
2018年11月 (105讲)
时长 01:23
2018年10月 (123讲)
时长 02:06
2018年09月 (119讲)
2018年08月 (123讲)
2018年07月 (124讲)
2018年06月 (119讲)
时长 02:11
2018年05月 (124讲)
时长 03:16
2018年04月 (120讲)
2018年03月 (124讲)
2018年02月 (112讲)
2018年01月 (124讲)
时长 02:30
时长 02:34
2017年12月 (124讲)
时长 03:09
2017年11月 (120讲)
2017年10月 (86讲)
时长 03:18
时长 03:31
时长 04:25
极客视点
15
15
1.0x
00:00/05:48
登录|注册

如何利用Elasticsearch增加TiDB的全文检索功能

讲述:丁婵大小:7.97M时长:05:48
来源:PingCAP(ID:pingcap2015)
此前,知乎技术平台负责人孙晓光与薛宁(@Inke)、黄梦龙(@PingCAP)、冯博(@知乎)组队参加了 TiDB Hackathon 2019,他们的项目 TiSearch 获得了 CTO 特别奖。就在最近,孙晓光发文分享了他们利用 Elasticsearch 帮助 TiDB 增加全文检索功能的经验,以下为原文内容。
“搜索”是大家在使用各种 APP 中非常重要的一个行为,对于知乎这样以海量优质内容为特色的产品来说,借助搜索帮助用户准确、快速地触达想要寻找的内容更是至关重要。而“全文检索”则是隐藏在简单的搜索框背后不可或缺的一项基本能力。
当前我们正逐步将越来越多的业务数据向 TiDB 迁移,目前在 TiDB 上我们只能使用 SQL Like 对内容进行简单的检索。但即便不考虑性能问题,SQL Like 仍然无法实现一些在搜索场景下常见的信息检索需求,例如,单纯使用 Like 会导致查询到有歧义的结果或满足搜索条件的结果无法返回。
当前 TiDB 全文检索能力的缺失,使得我们依旧需要使用传统的方式将数据同步到搜索引擎,在过程中需要根据业务特点做大量繁琐的数据流水线工作来维护业务数据的全文索引。为了减少这样的重复劳动,在今年 TiDB Hackathon 中我们尝试为 TiDB 引入“全文检索”功能,为存储在 TiDB 中的文本数据提供随时随地搜索的能力。

方案设计

要在短短一天的 Hackathon 时间内让 TiDB 中支持全文检索,难度还是非常大的,于是在最开始的时候,我们就选择了一条非常稳妥的设计方案——采用整合 Elasticsearch 的方式为 TiDB 扩展全文检索能力。
为什么选择 Elasticsearch?一方面我们可以充分利用其成熟的生态直接获得中文分词和 Query 理解能力。另一方面,生态融合所带来的强强联合效应,也符合 TiDB 崇尚社区合作的价值观。
考虑到工作量,对于全文索引的数据同步方案,我们没有采用 TiKV Raft Learner 机制,也没有使用 TiDB Binlog 的方式进行同步,而是采用了最保守的双写机制直接在 TiDB 的写入流程中增加了全文索引更新的流程。
架构如上图所示,TiDB 作为 Elasticsearch 和 TiKV 之间的桥梁,所有同 Elasticsearch 的交互操作都嵌入在 TiDB 内部直接完成。
在 TiDB 内部,我们将表额外增加了支持 全文(FULLTEXT)索引的元数据记录,并且在 Elasticsearch 上面创建了对应的索引和 Mapping,对于全文索引中的每一个文本列,我们都将它添加到 Mapping 中并指定好需要的 Analyzer,这样就可以在索引上对这些文本列进行全文检索了。
在 Elasticsearch 索引的帮助下,我们只需要在写入数据或者对数据进行更新时在 Elasticsearch 的索引上进行对应的更新操作,就保持 TiDB 和 Elasticsearch 数据的同步。而对于查询,流程如下:
TiDB 解析用户发送的 Query。
如果发现该 Query 带有全文检索的 hint,TiDB 则会将请求发给 Elasticsearch,使用 Elasticsearch 索引查询到记录主键。
TiDB 拿到所有记录主键之后,在 TiDB 内部获取实际的数据,完成最终的数据读取。
TiDB 将结果返回给用户。

未来规划

Hackathon 短短的 24 小时,让我们验证了整合 TiDB 和 ES 的可能性,当然,我们不会满足于这套双写的方案。未来我们会参考 TiFlash,基于 Raft Learner 实时将数据变更同步给 Elasticsearch,将 TiDB 打造成一个真正的能支持实时全文检索的 HTAP 数据库。
使用 Raft Learner,对于写流程,TiDB 会直接将数据写给底层的 TiKV,而 TiKV 会通过 Raft 协议将写入数据同步到 ES Learner 节点,通过该 Learner 节点写入到 ES。
对于读流程,TiDB 会解析到用户发过来的 Query 带有全文检索的 hint,然后将请求发给 ES Learner 节点。ES Learner 节点首先通过 Raft 协议来确保节点上面有了最新的数据,并且最新的数据已经写入到 Elasticsearch,再通过索引读取到对应的记录主键,返回给 TiDB。最后 TiDB 使用记录主键获取到完整的数据,并返回给客户端。
可以看到,相比于之前让 TiDB 双写到 Elasticsearch 和 TiKV 的方案,在写入上面,TiDB 并不需要跟 Elasticsearch 进行交互,而在读取方面,通过 Raft 协议,TiDB 也能保证从 Elasticsearch 读取到最新的数据,保证了数据的一致性。
以上就是今天的内容,希望对你有所帮助。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
该免费文章来自《极客视点》,如需阅读全部文章,
请先领取课程
免费领取
登录 后留言

全部留言(1)

  • 最新
  • 精选
  • 云学
    两种方案对比: 方案一: es和tidb强耦合,双写使得写入慢,读取快 方案二: 通过增加eslearner来解偶,写入快,读取慢(需要等待数据同步)
收起评论
显示
设置
留言
1
收藏
60
沉浸
阅读
分享
手机端
快捷键
回顶部