在Elasticsearch中我有这个索引和映射:
PUT /myindex
{
"mappings": {
"myentries": {
"_all": {
"enabled": false
},
"properties": {
"yid": {"type": "keyword"},
"days": {
"properties": {
"Type1": { "type": "date" },
"Type2": { "type": "date" }
}
},
"directions": {
"properties": {
"name": {"type": "keyword"},
"recorder": { "type": "keyword" },
"direction": { "type": "integer" }
}
}
}
}
}
}
我想为映射recorder
中direction
和directions
的每个值组合生成N个FlowFiles,1。我怎么能在Nifi中做到这一点?我正在考虑使用GenerateFlowFile
,但是如何应用与Elasticsearch相关的逻辑?
一种可能的解决方法可能是使用GenerateFlowFile
生成N个FlowFiles,其中Batch
字段可以硬编码并设置为10(Elastic中的条目数)。但后来我不知道下一步应该是什么?
答案 0 :(得分:1)
GenerateFlowFile
可能不是正确的工具,因为它不接受传入的连接,因此您无法使用计数对其进行参数化。您可以使用SplitJson
,它会将流文件拆分为多个流文件,给定一个 JSONPath 表达式,该表达式从JSON内容返回一个数组。
<强>更新强>
这是一个great tool,您可以使用它来动态评估JSONPath并查看它匹配的内容。在您的示例中,我们假设您收到了以下数据:
{
"yid": "nifi",
"days" : [{"Type1": "09/07/2017"},{"Type2":"10/07/2017"}],
"directions": [
{
"name": "San Francisco",
"recorder" : "Samsung",
"direction": "0"
},
{
"name": "Santa Monica",
"recorder" : "iPhone",
"direction": "270"
},
{
"name": "San Diego",
"recorder" : "Razr",
"direction": "180"
},
{
"name": "Santa Clara",
"recorder" : "Android",
"direction": "0"
}
]
}
JSONPath表达式$.directions[*].direction
将返回:
[
"0",
"270",
"180",
"0"
]
这将允许SplitJson
创建四个包含派生内容和fragment
属性的流文件,以将它们关联回原始流文件。
如果您确实需要在结果方向上执行排列逻辑&amp;记录器值,您可能希望使用ExecuteScript
和一个简单的Groovy / Ruby / Python脚本来内联执行该操作并拆分结果值。