首页 体育 教育 财经 社会 娱乐 军事 国内 科技 互联网 房产 国际 女人 汽车 游戏

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

2020-01-12

孙晓光,知乎技能渠道负责人,与薛宁、黄梦龙、冯博组队参加了 TiDB Hackathon 2019,他们的项目 TiSearch 取得了 CTO 特别奖。

“查找”是咱们在运用各种 APP 中十分重要的一个行为,关于知乎这样以海量优质内容为特征的产品来说,凭借查找协助用户精确、快速地触达想要寻觅的内容更是至关重要。而“全文检索”则是隐藏在简略的查找框背面不可或缺的一项根本才能。

当时咱们正逐渐将越来越多的事务数据向 TiDB 搬迁,现在在 TiDB 上咱们只能运用 SQL Like 对内容进行简略的检索。但即使不考虑功用问题,SQL Like 依然无法完结一些在查找场景下常见的信息检索需求,例如下图所示的几种场景,单纯运用 Like 会导致查询到有歧义的成果或满意查找条件的成果无法回来。

当时 TiDB 全文检索才能的缺失,使得咱们仍旧需求运用传统的方法将数据同步到查找引擎,在过程中需求依据事务特色做很多繁琐的数据流水线作业保护事务数据的全文索引。为了削减这样的重复劳动,在本年 TiDB Hackathon 中咱们测验为 TiDB 引进“全文检索”功用,为存储在 TiDB 中的文本数据供给随时随地查找的才能。以下是终究的作用展现:

要在短短一天的 Hackathon 时间内让 TiDB 中支撑全文检索,难度仍是十分大的,所以在最开端的时分,咱们就挑选了一条十分保险的设计计划 - 选用整 合  Elasticsearch 的方法为 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。

热门文章

随机推荐

推荐文章