ElasticSearch:是否可以在ElasticSearchTemplate中使用mustache循环

vd8tlhqk  于 2023-04-20  发布在  ElasticSearch
关注(0)|答案(1)|浏览(120)

在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"}]
  }
}

谢谢!
更新:下面是一个完整的例子
Map如下:

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]"

为什么循环不工作?

8ljdwjyq

8ljdwjyq1#

您几乎已经完成了,只是忘记在最后一个元素中指定last

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

更新:

问题是在你的压缩版本中,一些花括号太靠近了,这会妨碍一些mustache syntax rules(两个{{和三个{{{的意思不一样)
这里需要加一个空格

...{\"filters\":{ {{#agg-att}}\"{{code}}\":{\"term\":{\"fieldArrayB.color\":\"{{code}}\"}}...
                 ^
                 |
             add space

还有一个在这里

...{{^last}},{{/last}}{{/agg-att}} }},...
                                  ^
                                  |
                              add space

这就是为什么使用完全格式化的模板总是更好,更易读的原因,就像下面这个:

POST _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":{}
                  }
                }
              }
            }
          }
        }
      }
    }
  }
    """
  }
}

相关问题