我们有一个带有嵌套字段的复杂对象,该字段的名称可以是动态的并且包含点。当我尝试将数据提取到Elasticsearch时,出现以下错误
Object mapping for [x] tried to parse field [x.y] as object, but found a concrete value
一个记录可以具有键/值,例如
a.b.c:4
,而在另一条记录中可以具有a.b:3
。我们无法控制即将到来的数据的来源,因此唯一的选择是更改Logstash中的对象。这是即将到来的对象的示例:{
"result": "https://www.yahoo.com",
"tags": {
"url": "https://www.yahoo.com",
"projectName": "monitor",
"host": "ttt",
"dd": 12345,
"vv": "kk"
},
"timestamp": 1586599441000,
"runId": 12345,
"performance": {
"x.y.z": 31307
},
"channel": "clientperf",
"asset": {
"a.b.c": 5,
"a.b":4
}
}
如您所见, Assets 和绩效中的值(value)都有点。根上的字段(如runId,performance和...)很好。我该如何解决此问题,方法是替换logstash中的点或任何不会给我错误的东西。我知道
de_dot
插件,但是要使用它,我们需要专门告诉嵌套字段的名称是什么,而我们不能为即将到来的记录强制命名。我也知道我们可以使用ruby
插件来实现这一点,但是我零 ruby 知识。任何帮助,我们将不胜感激。
最佳答案
可以使用Hash#deep_transform_keys
中的ActiveSupport
:
class Hash
def deep_transform_keys(&block)
result = {}
each do |key, value|
result[yield(key)] = value.is_a?(Hash) ? value.deep_transform_keys(&block) : value
end
result
end
end
puts hash.deep_transform_keys { |key| key.to_s.gsub(".", "" ) }
关于ruby - 如何从Logstash中的嵌套对象中删除点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61234551/