出自 图灵学院 ElasticSearch课程, 我自己学完了,整理了一下,然后给老师说的话,记录了一下,发了个博客
概述
搜索模板,search template,高级功能,就可以将我们的一些搜索进行模板化,然后的话,每次执行这个搜索,就直接调用模板,给传入一些参数就可以了
search template就类似MySQL的存储过程和存储函数
MySQL的存储过程和存储函数就直接放到MySQL里面的,执行效率比较高,比较复杂的逻辑可以直接封装好,然后程序员直接快速的调用就可以了.
search template搜索模板在公司不一定能用得到.
但是一般高阶专门搞ElasticSearch的开发人员可能就会用到了.
template入门案例
简单定义参数并传递
source和params 是关键字,不能随便改的.
GET /cars/_search/template
{
"source": {
"query": {
"match": {
"remark": "{{kw}}"
}
},
"size": "{{size}}"
},
"params": {
"kw": "大众",
"size": 2
}
}
toJson方式传递参数
GET cars/_search/template
{
"source": """{ "query": { "match": {{#toJson}}parameter{{/toJson}} }}""",
"params": {
"parameter": {
"remark": "大众"
}
}
}
toJson不要随便改,是一个关键字
join方式传递参数
GET cars/_search/template
{
"source": {
"query": {
"match": {
"remark": "{{#join delimiter=' '}}kw{{/join delimiter=' '}}"
}
}
},
"params": {
"kw": [
"大众",
"标致"
]
}
}
上面的dsl的意思是
remark:”大众 标致”
默认值定义:
下面的 {{^end}}200000{{/end}}” 语法就是定义了一个默认值
GET cars/_search/template
{
"source": {
"query": {
"range": {
"price": {
"gte": "{{start}}",
"lte": "{{end}}{{^end}}200000{{/end}}"
}
}
}
},
"params": {
"start": 100000,
"end" : 200000
}
}
GET cars/_search/template
{
"source": {
"query": {
"range": {
"price": {
"gte": "{{start}}",
"lte": "{{end}}{{^end}}200000{{/end}}"
}
}
}
},
"params": {
"start": 100000
}
}
“lte”: “{{end}}{{^end}}200000{{/end}}” 中{{^end}}200000{{/end}}的意思是声明默认值
上面两个dsl语句效果是一样的.
记录template实现重复调用
可以使用Mustache语言作为搜索请求的预处理,它提供了模板,然后通过键值对来替换模板中的变量。把脚本存储在本地磁盘中,默认的位置为:elasticsearch\config\scripts,通过引用脚本名称进行使用
1 保存template到ES
test 是模板名字
POST _scripts/test
{
"script": {
"lang": "mustache",
"source": {
"query": {
"match": {
"remark": "{{kw}}"
}
}
}
}
}
2 调用template执行搜索
“id”: “test”, 意思是调用名字为test的模板
params就是调用模板的值
GET cars/_search/template
{
"id": "test",
"params": {
"kw": "大众"
}
}
3 查询已定义的template
GET _scripts/test
结果:
{
"_id" : "test",
"found" : true,
"script" : {
"lang" : "mustache",
"source" : """{"query":{"match":{"remark":"{{kw}}"}}}""",
"options" : {
"content_type" : "application/json; charset=UTF-8"
}
}
}
4 删除已定义的template
DELETE _scripts/test