Elasticsearch 搜索模板詳解
一. 爲什麼使用搜索模板
日常開發時,通常我們都不需要使用搜索模板,但如果遇到非常複雜的業務場景,如金融、醫藥等,可能一次搜索需要傳入或返回幾十個字段,搜索幾百個field、過濾條件、聚合分析等邏輯非常複雜,此時搜索模板就派上用場了。搜索模板就像Mysql中的procedure、function那樣,只需要使用比如kibana訪問ES,定義一次搜索模板,後續在代碼中調用模板並傳參即可完成搜索功能。
二. template入門案例
本入門案例中定義的搜索模板僅在一次查詢調用時生效,沒有讓Elsticsearch保存(記憶)搜索模板,至於如何創建能讓ES記憶的搜索模板,可以看本文第三節。
“source” 代表搜索模板,內含要執行的search語句
"params"是需要向模板中傳遞的變量。
{{變量名}}用於定義模板中的變量參數。
2.1 標準形式
不難發現,如果去掉"source"標籤,實際上這就是一個標準的搜索條件語句。
GET /index_name/_search/template
{
"source": {
"query": {
"match": {
"remark": "{{kw}}"
}
},
"size": "{{size}}"
},
"params": {
"kw": "真正的數值",
"size": 100
}
}
2.2 toJson形式
toJSON形式的特點在於,source使用字符串來定義。注意: source內需要用到轉義字符。
GET cars/_search/template
{
"source": "{ \"query\": { \"match\": {{#toJson}}parameter{{/toJson}} }}",
"params": {
"parameter" : {
"remark" : "真正的數值"
}
}
}
2.3 join方法傳參
join方式傳入的是數組,讓Elasticsearch來進行數據的拼接。
GET index_name/_search/template
{
"source" : {
"query" : {
"match" : {
"remark" : "{{#join delimiter=' '}}kw{{/join delimiter=' '}}"
}
}
},
"params": {
"kw" : ["大衆", "標緻", "奔馳", "寶馬"]
}
}
等價於"remark": “大衆 標誌 奔馳 寶馬”。
2.4 default value形式
以下語句中,^end表示爲end這個參數設置了默認值。如果在params中傳遞了end,則使用傳遞的數值,如果沒有傳遞end,則使用默認的數值。
GET index_name/_search/template
{
"source" : {
"query" : {
"range" : {
"price" : {
"gte" : "{{start}}",
"lte" : "{{end}}{{^end}}200000{{/end}}"
}
}
}
},
"params": {
"start" : 100000
}
}
三. 記憶template並實現重複調用
3.1 Elasticsearch保存template
必須指定template的名稱,方便後續反覆調用。
POST _scripts/my_test_template
{
"script": {
"lang": "mustache",
"source": {
"query": {
"match": {
"field_name": "{{kw}"
}
}
}
}
}
3.2 調用 template
調用template時,通過id來指定具體的template。
GET index_name/_search/template
{
"id": "my_test_template",
"params": {
"kw": "自定義template的參數值"
}
}
3.3 查詢已定義的template
GET _scripts/template_name
3.4 刪除已定義的template
DELETE _scripts/template_name