ElasticSearch Mustache多维参数遍历模板故障排查求助
ElasticSearch Mustache模板遍历多维数组失败排查
问题背景
我尝试在ElasticSearch的Mustache模板中遍历多维参数att,但代码无法正常运行。
传入的Elastic查询参数
GET my_idx/_search/template { "id": "my_template", "params": { "att" : [ {"code":"epi", "values" : [{ "value":"glove"}, {"value":"hat","lastValue":true}]}, {"code":"color", "values": [{"value":"Black"}, {"value":"White", "lastValue":true}], "last":true} ] } }
注:原参数存在语法错误,已修正color对象的闭合括号
无效的Mustache模板代码
{{#att}} { "bool" : { "should" : [ {{#values}} { "nested": { "path": "nestedField", "query": { "bool": { "must": [ {"match": {"att.value": "{{value}}"}}, {"match": {"att.code": "{{../code}}"}}] } } } } {{^lastValue}}, {{/lastValue}} {{/values}} ] } }{{^last}}, {{/last}} {{/att}}
测试验证(普通Mustache环境正常)
我在普通Mustache环境中做了测试,以下数据和模板可以正常运行:
测试数据
var data = { "Subject": "Template Engines", "attributs": [{ "code": "enduction", "values": [{ "value": "Paume et doigts" }, { "value": "Non Enduit", "lastValue": true } ] }, { "code": "coloris", "values": [{ "value": "Noir" }, { "value": "Blanc", "lastValue": true } ], "last": true } ] };
测试模板
<h1>{{Subject}}</h1> <ul> {{#attributs}} <li>{{code}} <ul>{{#values}} <li>{{code}} => {{value}}{{^lastValue}}, {{/lastValue}}</li> {{/values}} </ul> {{^last}}, {{/last}} </li> {{/attributs}} </ul>
问题原因分析
- ES Mustache语法差异:ElasticSearch对Mustache的支持并非完全遵循标准,
../这种父级变量引用方式在ES模板中可能无法正常工作,上下文变量查找逻辑和普通Mustache环境不同。 - JSON格式严格性:ES要求渲染后的查询必须是完全合法的JSON,原模板中逗号处理的空格可能导致格式错误,且ES对模板渲染的上下文判断存在偏差,容易出现多余逗号。
- 原始参数语法错误:最初传入的
params中color对象缺少闭合括号,这会直接导致模板渲染失败。
修正后的模板代码
{{#att}} { "bool": { "should": [ {{#values}} { "nested": { "path": "nestedField", "query": { "bool": { "must": [ {"match": {"att.value": "{{value}}"}}, {"match": {"att.code": "{{code}}"}} ] } } } }{{#lastValue}}{{else}},{{/lastValue}} {{/values}} ] } }{{#last}}{{else}},{{/last}} {{/att}}
修正点说明
- 替换
{{../code}}为{{code}}:在ES Mustache的{{#values}}子块中,可直接通过{{code}}访问父级att的code变量,ES会自动向上查找上下文。 - 调整逗号判断逻辑:使用
{{#lastValue}}{{else}},{{/lastValue}}替代原写法,避免空格导致的JSON格式问题,逻辑更严谨。 - 确保JSON语法合规:去掉冗余空格,保证渲染后的查询JSON无多余逗号。
内容的提问来源于stack exchange,提问作者toch
相关产品推荐
相关产品推荐

