作者介绍
孙晓光,知乎技术平台负责人,与薛宁(@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 扩展全文检索能力。


未来规划

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

最后修改时间:2019-12-11 09:25:26
文章转载自PingCAP,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。