Search Template
/_search/template端点允许使用mustache语言在执行前预渲染搜索请求,并使用模板参数填充现有模板。
GET /_search/template
{
"inline" : {
"query": { "match" : { "{{my_field}}" : "{{my_value}}" } },
"size" : "{{my_size}}"
},
"params" : {
"my_field" : "foo",
"my_value" : "bar",
"my_size" : 5
}
}关于Mustache templating以及你可以使用哪种模板,请参考 mustache项目在线文档。
注意:
mustache语言在elasticsearch中作为沙盒脚本语言实现,因此对于启用或禁用,源代码和操作等设置,它遵从脚本文档的描述。
更多的模板案例
使用单个值填充查询字符串
将参数转换为 JSON
{{#toJson}}parameter{{/toJson}}函数可以用来转换参数(比如maps和array)为它们的JSON形式。
其呈现为:
更复杂的例子代替一个 JSON 对象数组:
呈现为:
连接数组的值
{{#join}}array{{/join}}函数能用来将数组的值连接为以逗号分隔的字符串:
其呈现为:
该函数还可以接受一个自定义分隔符:
呈现为:
默认值
默认值被写成{{var}}{{^var}}default{{/var}}比如:
此时params是 { "start": 10, "end": 15 },该查询可以呈现为:
但是,params是{ "start": 10 }时, 该查询就会使用默认值作为end:
条件语句
条件语句不能使用模板的 JSON 形式表示。相反,模板必须作为字符串传递。例如,假设我们想在line字段上运行match查询,并且可以选择用行号过滤其中start和end是可选的。
参数(params)会像这样:
①、②、③ 所有这三个元素都是可选的。
查询语句我们可以是:
① 填充text参数值。
② 仅当指定line_no时才能包含range过滤器。
③ 仅当指定了line_no.start时才能包含gte子句。
④ 填充line_no.start参数值。
⑤ 仅当line_no.start和line_no.end被指定时,在gte子句后添加逗号。
⑦⑨ 仅当指定line_no.end时,包含lte子句。
⑩ 填充 line_no.end 参数值。
注意:
如上所述,模板不是有效的JSON 形式,因为它包含类似
{{line_no}}的部分标记,因此,模板应存储在文件中(参考预注册模板一节)或者在通过REST API使用时,应该将其写成字符串格式,比如:
URL编码
可以使用{{#url}}value{{/ url}}函数按HTML规范中定义的HTML编码格式对字符串值进行编码。
作为一个例子,编码一个URL是很有用的:
前面的查询将呈现为:
预注册(Pre-registered)模板
你可以通过将搜索模板存储在config/scripts目录中,在使用 .mustache扩展名的文件中注册搜索模板。为了执行存储的模板,请使用template键下的名称来引用它:
① config/sripts/查询模板的名称,即:storedTemplate.mustache。
你还可以通过将搜索模板存储在集群状态中来注册搜索模板,由REST API来管理这些索引的模板。
该模板可以通过以下方法来检查:
其可以呈现为:
这个模板可以被删除:
在搜索时使用索引模板,使用:
① 存储在 .scripts 索引中的查询模板的名称。
验证(Validating)模板
可以在具有给定参数的响应中使用来呈现模板:
此次调用将返回呈现的模板:
① status 数据已使用来自 params 对象的值填充。
文件和索引模板也可以通过分别用file或id代替inline来呈现。例如,呈现文件模板:
预注册模板可以使用以下呈现:
Explain
你可以在运行模板时使用Explain参数:
Profiling
你可以在运行模板时使用Profiling参数:
Last updated
Was this helpful?