es怎么对应mysql es mysql

【elasticsearch实战】mysql的数据如何迁移到es中 如果你被上述问题困扰过,可以参考以下方案
这里需要介绍三种字段的type , 分别是object 、 nested 、 join
现在有个问题,下面的数据如何存入到es中呢,它对应的mapping应该是什么样的呢
name、url这些字段好处理,直接设定字段 "type" : "text" 或者 "type" : "keword" 或者
就行了,但是对于address和links,这种里面包含json对象 , 或者数组的,怎么处理呢 。这里可以采用 "type" : "object" 来处理 。如下
可能会对links有疑问,它明明是数组,却怎么和address的设置类似 。其实es中是没有单独的数组这一类型,因为他所有的字段都支持数组,比如你是text,你可以放多个值进去,以name为例,你可以放 "name":["张三", "李四"] 这样的数据进去 。
而且,es默认对这种嵌套结构建立的索引就是object类型,"type": "object" 可以省略 ??
于是可以变为下面这样
甚至,通过添加properties,可以无限嵌套下去 。
下面说object类型的缺点了 , 缺点也是由它本身结构导致的
对于数组结构,是这么存储数据的,以上面的address为例,他会把json结构平铺开 , 然后把所有这个字段的值放在平铺后的字段上:
这在查询时就出现问题了,本来Google和是绑定的,但是这种结构无法满足这种绑定的关系,也就是如果你想查name是Baidu , 并且url是的,竟然也能查出来??,而这和前面所插入的文档内容不符 。
所以需要nested结构和join结构出场了
嵌套结构解决了我们查询嵌套文档字段的问题,同样的,也可以解决,在es中实现类似mysql的join查询的问题 。
【es怎么对应mysql es mysql】外键就需要设置为nested(虽然现在设计表几乎不用外键约束了 , 但外键的逻辑还是在的?? )
另外 , nested字段本身会形成一个文档,只不过是嵌套在大的文档下,所以在统计索引的文档数时,实际上是最外层的文档数加上nested字段形成的文档数
这里需要注意,以nested里面的字段为查询条件 , 需要修改下查询DSL , 在外层加一层nested , 每有一层nested嵌套关系,就需要加一层
由于es本身对文档通过nested字段进行了绑定,索引更新数据时,整个文档都会被替换 , 代价会大一些,但是由于关系绑定好了 , 查询会快一些 。这里的代价大一些,查询快一些自然就是和join类型对比啦 。
join 其实有父子文档的概念,父文档通过一个字段关联一个子文档,
这个结构比较复杂的是在你推数据时 , 需要指定对应的父文档是哪个
mapping结构如下
解释一下
优点就是更新数据时,不用连带着父子文档一起改,缺点是查询效率不如nested结构
以后再说吧??
使用canal将mysql同步到es中 因为自己项目中需要用到mysql数据同步到es中,查找了相关资料最后决定用canal来做,所以便有了本文,下面一起来看如何使用canal吧
根据上的原理解释,我们知道 canal 会模拟 mysql slave 的交互协议,伪装自己为 mysql slave , 然后向 mysql master 发送 dump 协议 。
mysql master 收到 dump 请求,开始推送 binary log 给 slave(也就是 canal),然后 canal 解析 binary log 对象(原始为 byte流) 。
经 canal 解析过的对象 , 我们使用起来就非常的方便了 。
再根据提供的版本信息,你会发现 canal 其实相当于一个中间件,专门用来解析 MySQL 的 binlog 日志 。canal 解析好了之后,会封装成一个数据对象 , 通过 protobuf3.0 协议进行交互,让 canal 客户端进行消费 。

推荐阅读