在Elasticsearch(ES)的日常开发和运维中,我们经常会遇到需要频繁执行相似查询的场景。这些查询可能因业务逻辑的复杂性而涉及多个字段、过滤条件和聚合分析。为了优化这些操作,提高开发效率,Elasticsearch提供了搜索模板(Search Templates)的功能。本文将介绍如何使用Elasticsearch的搜索模板来重用和共享查询。
一、为什么使用搜索模板
在日常开发中,尽管大多数查询可能相对简单,但在一些复杂的业务场景(如金融、医药等)中,一次搜索可能需要传入或返回几十个字段,同时涉及复杂的过滤条件和聚合分析。此时,手动编写每个查询不仅效率低下,还容易出错。搜索模板就像MySQL中的存储过程或函数,只需定义一次,后续在代码中通过调用模板并传递参数即可完成搜索功能,极大地提高了开发效率和查询的灵活性。
二、搜索模板的入门案例
2.1 标准形式
搜索模板的基本形式是定义一个包含查询条件的JSON对象,并通过_search/template
API调用。例如:
json
GET /index_name/_search/template
{
"source": {
"query": {
"match": {
"remark": "{{kw}}"
}
},
"size": "{{size}}"
},
"params": {
"kw": "真正的数值",
"size": 100
}
}
在这个例子中,{``{kw}}
和{``{size}}
是模板中的变量,通过params
对象传递具体的值。
2.2 toJSON形式
toJSON
形式的特点在于source
使用字符串来定义,且需要用到转义字符。例如:
json
GET cars/_search/template
{
"source": "{ \"query\": { \"match\": {{#toJson}}parameter{{/toJson}} }}",
"params": {
"parameter": {
"remark": "真正的数值"
}
}
}
2.3 join方法传参
使用join
方法可以将数组中的元素拼接成字符串,用于查询条件。例如:
json
GET index_name/_search/template
{
"source": {
"query": {
"match": {
"remark": "{{#join delimiter=' '}}kw{{/join delimiter=' '}}"
}
}
},
"params": {
"kw": ["大众", "标致", "奔驰", "宝马"]
}
}
2.4 默认值形式
在模板中可以为参数设置默认值,如果调用时没有传递该参数,则使用默认值。例如:
json
GET index_name/_search/template
{
"source": {
"query": {
"range": {
"price": {
"gte": "{{start}}",
"lte": "{{end}}{{^end}}200000{{/end}}"
}
}
}
},
"params": {
"start": 100000
}
}
三、记忆template并实现重复调用
3.1 Elasticsearch保存template
为了重用模板,我们可以将其保存在Elasticsearch中。通过指定模板的名称,方便后续反复调用。例如:
json
POST _scripts/my_test_template
{
"script": {
"lang": "mustache",
"source": {
"query": {
"match": {
"field_name": "{{kw}}"
}
}
}
}
}
3.2 调用template
调用模板时,通过id
来指定具体的模板,并传递相应的参数。例如:
json
GET index_name/_search/template
{
"id": "my_test_template",
"params": {
"kw": "自定义template的参数值"
}
}
3.3 查询已定义的template
通过GET请求可以查询已定义的模板信息,例如:
json
GET _scripts/my_test_template
3.4 删除已定义的template
如果需要删除已定义的模板,可以使用DELETE请求,例如:
json
DELETE _scripts/my_test_template
四、搜索模板的高级应用
4.1 验证模板
Elasticsearch提供了_render/template
API来验证模板。