Apache nifi 如何将POST查询的特定值替换为InvokeHTTP?

Apache nifi 如何将POST查询的特定值替换为InvokeHTTP?,apache-nifi,Apache Nifi,我有以下处理器序列: 我使用ReplaceText处理器创建POST查询主体。此处理器链接到InvokeHTTP。 ReplaceText中的替换值为: { "size": 0, "query": { "bool": { "filter": [ {"term": {"Field1": ""}}, {"term": {"Field2": ""}}, {"term": {"Field3": ""}}, {"

我有以下处理器序列:

我使用
ReplaceText
处理器创建POST查询主体。此处理器链接到
InvokeHTTP
ReplaceText
中的替换值为:

{
  "size": 0,
  "query": {
    "bool": {
      "filter": [
        {"term": {"Field1": ""}},
        {"term": {"Field2": ""}},
        {"term": {"Field3": ""}},
        {"term": {"Field4": ""}}
      ]
    }
  },
  "aggs": {
    "range": {
        "date_range": {
            "field": "Datetime",
            "ranges": [
                { 
                   "from": "2017-02-17T16:00:00Z||-1H/H",
                   "to": "2017-02-17T16:00:00Z||/H" 
                }
            ]
        }
    }
  }
}
在执行
InvokeHTTP
中的查询之前,我需要根据输入流文件的实际字段值(输出
UpdateAttribute
)替换
Field1
Field2
Field3
Field4
)的值

例如,在输入流文件中,我的
Field1
等于
ABC
,因此在我的后期查询中
Field1
应该等于
ABC
,而不是空字符串

最好的方法是什么?

您可以在文本中使用。假设您有4个属性字段.1到字段.4,您可以用以下内容替换整个文本:

{
  "size": 0,
  "query": {
    "bool": {
      "filter": [
        {"term": {"Field1": "${field.1}"}},
        {"term": {"Field2": "${field.2}"}},
        {"term": {"Field3": "${field.3}"}},
        {"term": {"Field4": "${field.4}"}}
      ]
    }
  },
  "aggs": {
    "range": {
        "date_range": {
            "field": "Datetime",
            "ranges": [
                { 
                   "from": "2017-02-17T16:00:00Z||-1H/H",
                   "to": "2017-02-17T16:00:00Z||/H" 
                }
            ]
        }
    }
  }
}

您可以使用
ReplaceText
使用正则表达式匹配字段定义,并用属性值替换它们。不幸的是,参数化要重复每个数字会有点棘手,因此最好明确定义它们:

  • 搜索值:
    “Field1\:”
  • 替换值:
    “Field1”:“${Field1}”

谢谢。我不明白一件事。假设我有
ListenHTTP
,它输出带有此内容的流文件
{“field1”:“AAA”,“field2”:“BBB”,“field3”:“CCC”}
。就在
ListenHTTP
之后,我添加了
UpdateAttribute
,并相应地创建了属性
field1
field2
field3
,其值分别为
${field1}
${field2}
${field3}
。但是,当我按照您的建议在POST查询中设置
{“term”:{“Field1”:“${Field1}”},
时,所有字段都是空的。我遗漏了什么?您的字段在内容中,而不是在属性中,因此您不能使用表达式语言引用它们。要使它们脱离JSON并进入属性,请使用EvaluateJsonPath。您将拥有一个名为“field1”的动态属性,其值为JSON路径“/field1”,其余字段也是如此。EvaluateJSONPath将替换流中的UpdateAttribute。