愚者求师之过,智者从师之长。

利用logstash-output-jdbc从mysql导入数据到es中,如何构建多级节点的JSON

匿名 | 发布于2017年06月17日 | 阅读数:5328

请教:利用logstash-output-jdbc从mysql导入数据到es中,如何构建多级节点的JSON.  如产品表,需要关联产品品牌,产品供应商。
SQL语句:SELECT
    product.id,
    product.code,
    product.name AS name,/**产品名称**/
    provider.id AS providerId,/**供应商id**/
    provider.CODE AS providerCode,/**供应商编号**/
    provider.NAME AS providerName,/**供应商名称**/
    brand.id AS brandId,/**品牌id**/
    brand.NAME AS brandName/**品牌名称**/
FROM
    t_product product
LEFT JOIN t_product_provider provider ON product.provider_id = provider.id
LEFT JOIN t_product_brand brand ON product.brand_id = brand.id
 
问题:如何生成类似如下的JSON对象
 
{"id" : "1",
"code":"001" ,
"name" :"####" ,
"brand":{    //品牌属性
           "id": "##",
          "name": "##"
      },
"provider":{    //供应商属性
          "id": "##",
          "code": "##",
         "name": "##"
       }
}
 
 
已邀请:

NovemberRain_Jack

赞同来自:

如果使用parent/child的话只需要在output中指定parent就好了
如果使用nested方式的话,就需要用到aggregate filter  官网有很具体的例子
匿名用户

匿名用户

赞同来自:

问题已解决,方法如下:
 
利用logstash-input-jdbc从mysql导入数据到es中,构建json嵌套解决方法:
1: 1对1的场景:
 
  在过滤器中处理:
filter {
        mutate {
            add_field => {
                "[brand][id]" => "%{brand_id}"
                "[brand][name]" => "%{brand_name}"
                "[provider][id]" => "%{provider_id}"
                "[provider]
" => "%{provider_code}"
            }
            remove_field => [ "brand_id", "brand_name","provider_id","provider_code"]            
        }

 }
 
2: 1对多的场景:
 
  filter {
        aggregate {
            task_id => "%{brand_id}"
        code => "
            map['brand_id'] = event.get('brand_id')
            map['brand_name'] = event.get('brand_name')
            map['products'] ||=
            map['products'] << {
                'id' => event.get('id'),
                'code' => event.get('code'),
                'name' => event.get('name'),
            }
            event.cancel()
            "
            push_previous_map_as_event => true
        }

 }
 

要回复问题请先登录注册