ElasticSearch:是否可以在 ElasticSearchTemplate 中使用小胡子进行循环

问题描述 投票:0回答:1

在 ElasticSearch 模板中,我想这样做:

  "aggs": {
        "att_characteristic": {
          "filters": {
            "filters": {
              {{#agg-att}}
              "{{code}}" : {"term": { "characteristic.code": "{{code}}"}}{{^last}}, {{/last}}
              {{/agg-att}}
            }
          },
          "aggs": {
            "agg_by_value": {
              "terms": {
                "field": "characteristic.value",
                "size": 10000
              },
              "aggs": {
                "top_reverse_nested": {
                  "reverse_nested": {}
                }
              }
            }
          }
        }
      }

但是我收到以下错误:

   "reason" : "Improperly closed variable in query-template:1 @[query-template:1]"

错误发生在:

{{#agg-att}}
  "{{code}}" : {"term": { "characteristic.code": "{{code}}"}}{{^last}}, {{/last}}
{{/agg-att}}

我们可以像在另一种语言中一样使用 Mustache 语言在 ElasticSearch 模板中循环吗?

PS : 它被称为

GET index-name-dev/_search/template
{
  "id": "search-template-test",
  "params": {
    "agg-att":[{"code":"Color"},
               {"code":"Shape"},
               {"code":"Size"}]
  }
}

谢谢!

更新:下面是一个完整的例子

映射如下:

PUT tly-idx_test1
{
  "mappings": {
    "properties": {
      "fieldA": {
        "type": "keyword"
      },
      "fieldArrayA": {
        "type": "keyword"
      },
     "fieldArrayB": {
      "type": "nested",
      "properties": {
        "color": {
          "type": "keyword",
          "fields": {
            "text": {
              "type": "text",
              "analyzer": "standard"
              }
            }
          },
          "size": {
            "type": "keyword",
            "fields": {
              "text": {
                "type": "text",
                "analyzer": "standard"
                }
              }
          },
          "shape": {
            "type": "keyword",
            "fields": {
              "text": {
                "type": "text",
                "analyzer": "standard"
                }
              }
            },
          "value": {
            "type": "keyword",
            "fields": {
              "text": {
                "type": "text",
                "analyzer": "standard"
                }
              }
            },
          "obligatoire": {
            "type": "boolean"
            }
        }
     },
      "fieldB": {
        "type": "text"
      },
      "fieldC": {
        "type": "text"
      },
      "fieldD": {
        "type": "text"
      },
      "fieldE": {
        "type": "boolean"
      }
    }
  }
}

下面是一些数据放在测试索引中

POST tly-idx_test1/_doc
{
  "fieldA": "M",
  "fieldB": "SHOWER PACK",
  "fieldC": "false",
  "fieldD": "01",
  "fieldE": "true",
  "fieldArrayA": [
    "val1",
    "val2",
    "val3"
  ],
   "fieldArrayB": [
    {"color":"red","size":"10cm","shape":"square","obligatoire":true,"value":"15"},
    {"color":"blue","size":"100cm","shape":"circle","obligatoire":true ,"value":"25"},
    {"color":"green","size":"50cm","shape":"rectangle","obligatoire":true ,"value":"35"},
    {"color":"yellow","size":"22cm","shape":"triangle","obligatoire":true ,"value":"45"}
    
  ]
}

下面是模板

GET tly-idx_test1/_search
{
  "query": {
    "match_all": {}
  },
  "aggregations": {
    "agg-attributs": {
      "nested": {
        "path": "fieldArrayB"
      },
      "aggs": {
        "att_obligatoire": {
          "filters": {
            "filters": {
              {{#agg-att}}
              "{{code}}" : {"term": { "fieldArrayB.color": "{{code}}"}}{{^last}}, {{/last}}
              {{/agg-att}}
            }
          },
          "aggs": {
            "agg_by_value": {
              "terms": {
                "field": "fieldArrayB.value",
                "size": 10000
              },
              "aggs": {
                "top_reverse_nested": {
                  "reverse_nested": {}
                }
              }
            }
          }
        }
      }
    }
  }
}

压缩:

PUT _scripts/tly-template-test
{
  "script": {
    "lang": "mustache",
    "source": "{\"query\":{\"match_all\":{}},\"aggregations\":{\"agg-attributs\":{\"nested\":{\"path\":\"fieldArrayB\"},\"aggs\":{\"att_obligatoire\":{\"filters\":{\"filters\":{{{#agg-att}}\"{{code}}\":{\"term\":{\"fieldArrayB.color\":\"{{code}}\"}}{{^last}},{{/last}}{{/agg-att}}}},\"aggs\":{\"agg_by_value\":{\"terms\":{\"field\":\"fieldArrayB.value\",\"size\":10000},\"aggs\":{\"top_reverse_nested\":{\"reverse_nested\":{}}}}}}}}}}"
  }
}

最后,下面是模板调用:

GET tly-idx_test1/_search/template
{
  "id": "tly-template-test",
  "params": {
    "agg-att": [{"code": "color"},
                {"code": "shape"},
                {"code": "size","last": true}
    ]
  }
}

我得到了同样的错误

"reason" : "Improperly closed variable in query-template:1 @[query-template:1]"

为什么循环不起作用?

loops elasticsearch templates mustache
1个回答
1
投票

快到了,只是忘记在最后一个元素中指定

last

GET index-name-dev/_search/template
{
  "id": "search-template-test",
  "params": {
    "agg-att": [
      {
        "code": "Color"
      },
      {
        "code": "Shape"
      },
      {
        "code": "Size",
        "last": true            <---- add this
      }
    ]
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.