canal 系列:ES中nested嵌套类型同步

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了canal 系列:ES中nested嵌套类型同步相关的知识,希望对你有一定的参考价值。

参考技术A

在日常的业务开发场景中,像 一个人有多套房子,多个住址 ,一篇文章中有多个评论这种需求还是非常常见的。当我们使用 Elasticsearch 来进行存储时, ES 的字段类型是 nested 类型 ,虽然这个效率不高。

当我们使用 canal 对数据进行增量同步到 ES 时,canal-adapter 是否是支持 nested 类型呢?

查看 issue 提问

好遗憾。大佬说暂时不支持。

在本想放弃的时候,看到 issue 中有位小伙伴说,配置 object 兼容 nested ,但是并没有给出解决方案。废话不多说,实践一把,走起。

1. 数据处理

1.1 创建 存在 字段类型为 nested 的索引 canal_test

首先创建 elasticsearch的索引名为 canal_test  ,其中 addresses 字段是 nested 类型

创建 两张表 t_address(地址表),t_rk (人口表)。一个人可以有多个地址,一对多的关系

默认已经熟悉 canal 和 canal-adapter 的使用。在同步到 es 中,我们知道需要为每个索引配置一份 yml 的配置文件,下面创建canal_test.yml 文件 ,同步配置如下

* 重点关注

配置中的关键

*  获取第 1 步中准备的sql,执行测试数据 sql

canal 执行日志

  3.  同步结果

4. 搜索验证 


查询结果:

好了 ,今天的实践就到这里。你学废了吗? 


这边格式有点奇怪,有需要可以到公众号看

https://mp.weixin.qq.com/s/jIVxxHp9GsE2WL2DNPsVJQ

Elasticsearch 7.x Nested 嵌套类型查询 ES 干货

参考技术A Elasticsearch 有很多数据类型,大致如下:

注意:tring/nested/array 类型字段不能用作排序字段。因此 string 类型会升级为:text 和 keyword。keyword 可以排序,text 默认分词,不可以排序。

Elasticsearch 7.x 文档中,这样写到:

Nested (嵌套)类型,是特殊的对象类型,特殊的地方是索引对象数组方式不同,允许数组中的对象各自地进行索引。目的是对象之间彼此独立被查询出来。

在 ES 的 my_index 索引中存储 users 字段。比如说:

其实存储看上去跟 Object 类型一样,只不过底层原理对数组 users 字段索引方式不同。设置 users 字段的索引方式 Nested 嵌套类型:

比如小老弟我有一波小粉丝,users 字段类型是 object。存储如下:

比如 18 岁大姑娘 Alice 是小老弟我的粉丝,她也可能是周杰伦的粉丝。那这边就有一个需求,即应用场景:

如何找到 18 岁大姑娘 Alice "name" : "Alice","age" : "18" 关注的所有明星呢?

如果用老的查询语句是这样搜索的:

结果发现结果是不对的,路人甲 这条记录也出现了。
因为匹配到了第一个 Alice + 第二个 Jeff 的 18。所以这种查询不满足这个场景

那么需要使用 Nested 类型并用 Nested 查询,即让数组中的对象各自地进行索引。目的是对象之间彼此独立被查询出来。

根据 2.2 如何使用 Nested 类型,将 users 字段类型从 object 修改为 nested:

修改后,对应的 Nested Query ,如下:

语法很简单就是:

这样查询得结果就是对的。

这边测试过,给大家一个测试报告和建议。

压测环境:3 个 server ,6 个 ES 节点

压测结论: 使用上小节查询语句,50 并发情况下,导致千兆网卡被打满了。TPS 4000 左右,如果提高并发,就会增加 RT。所以如果高性能大流量情况下,必须用 Nested 应该从网络流量方向进行优化。二者,尽量减少大数据对象的返回

建议:泥瓦匠建议,你听听看

(完)

参考资料:

以上是关于canal 系列:ES中nested嵌套类型同步的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch 7.x Nested 嵌套类型查询 ES 干货

Elasticsearch es nested 嵌套类型 详解

[ElasticSearch]ES操作之嵌套查询(nested)与退出嵌套(reverse_nested)操作

使用canal将mysql同步到es中

Canal实现Mysql和ES数据同步

canal实现同步mysql至es