JSON字段从postgres导入到elasticsearch

时间:2016-01-19 17:11:35

标签: json postgresql elasticsearch logstash

我尝试使用嵌入对象从postgres导入一些数据到弹性搜索使用json_agg,但ES不会像嵌套对象那样保存数据,但是保存为这样

"some_objects": {"type": "json", "value": "[{\"a\":\"1\"}]"}

代替:

"some_objects": [{"a":"1"}]

每当我在查询中使用json类型时(我通过" logstash"导入数据)都会发生这种情况。 如果我需要导入连接对象,我使用hstore和它的工作,但我不能将hstore用于多个对象,不幸的是我不能使用json而不是json。

我用于导入数据的SQL看起来像这样

SELECT a.*,  
    (SELECT json_agg(hstore(so)) AS some_objects FROM
        (SELECT * FROM c WHERE a.id=c.a_id) AS so),
(SELECT hstore(ao) AS another_object FROM (SELECT b.*) AS ao),
FROM a_table AS a
LEFT OUTER JOIN b ON a.id=b.a_id

在elasticsearch的映射数据中,我设置了:

...
"some_objects": {
    "type": "nested" 
},
"b": {
    "type": "object"
}

它成功地适用于" b",并且不适用于" some_objects"。显然它取决于postgres中的json类型。 我有什么想法可以解决它吗?

非常感谢。

1 个答案:

答案 0 :(得分:1)

红宝石过滤器解决了这个问题。

filter {
    ruby {
        code => "
            require 'json'
            some_json_field_value = JSON.parse(event['some_json_field'].to_s)
            event['some_json_field'] = some_json_field_value
        "
    }
}