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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章