是时候用 ES 拯救发际线啦

如何实现将mysql 1对多数据导入到es 的nested 嵌套字段中

Elasticsearch | 作者 wengxuejie | 发布于2018年10月15日 | 阅读数:6177

目前有个电商筛选的需求,希望实现属性聚合,类似京东
但是数据库里的属性是1对多的关系,也就是一个商品id 对应多个属性,
es中是netsted 的结构类似
{

            "_index": 'test',

            '_type': 'goods',

            '_id': 3,

            '_source': {

                'goods_id': 3,

                'goods_name': 'honor 8',

                'attrs': [

                    {

                        'attr_name': u'颜色',

                        'attr_value': u'金色',

                    },

                    {

                        'attr_name': u'零件状态',

                        'attr_value': u'在售',

                    },

                    {

                        'attr_name': u'发货周期',

                        'attr_value': u'17 周',

                    },

                ]

            }

        }
 
mysql查出来后如何将数据导入到es 的nested 数据中
 
我目前想到的方案只能解决全量同步
1、视图先将mysql的商品和属性在一张表里,但是是1对多的数据
2、将数据通过脚本导入到es
 
坏处是无法增量同步,如何实现增量同步呢
肯定各位高手解答
@medcl
 
WechatIMG15.jpeg
已邀请:

kennywu76 - Wood

赞同来自: laoyang360

在ES官方论坛看到一个类似的问题,有人给出的解决方案是使用logstash的aggregate filter plugin,将同一个id的多个文档在内存里合并成一个,从而可以将数据库里多条文档合并成一个内嵌的json结构再发送给ES。  参看一下该链接里回答者给出的范例,看能否满足你的需求。https://discuss.elastic.co/t/h ... 871/5
 

rochy - rochy_he

赞同来自:

如果使用 logstash 进行同步,增量同步需要表结构必需包含更新时间字段(取字表与主表更新时间的最大值)
这样视图的每一条结果里面也存在更新时间
在使用 SQL 进行同步的时候就可以根据上一次同步时间来进行同步
从而实现增量同步

wengxuejie

赞同来自:

logstash如何将mysql1对多的数据导入到es的nested 嵌套结构?这块我一直没想明白,目前看logstash 都是导入扁平结构数据

wengxuejie

赞同来自:

或者说属性聚合有什么好的办法吗

laoyang360 - 《一本书讲透Elasticsearch》作者,Elastic认证工程师 [死磕Elasitcsearch]知识星球地址:http://t.cn/RmwM3N9;微信公众号:铭毅天下; 博客:https://elastic.blog.csdn.net

赞同来自:

增量有两种方式:1、基于自增id; 2、基于时间戳。两种方式logstash_input_jdbc插件(5.X之后logstash已自带)都可以支持的。

zwy_

赞同来自:

请问这个问题您解决了吗,我遇到了同样的需求

要回复问题请先登录注册