1. 程式人生 > >Elasticsearch 之(36)使用search template將搜尋模板化

Elasticsearch 之(36)使用search template將搜尋模板化

前言
搜尋模板,search template,高階功能,就可以將我們的一些搜尋進行模板化,然後的話,每次執行這個搜尋,就直接呼叫模板,給傳入一些引數就可以了,如果不瞭解搜尋語法的,可以先閱讀《 Elasticsearch 之(5)kibana多種搜尋方式》
1、search template入門
search template:"{{field}}" : "{{value}}" ,設定search template
GET /blog_website/blogs/_search/template
{
  "inline" : {
    "query": { 
      "match" : { 
        "{{field}}" : "{{value}}" 
      } 
    }
  },
  "params" : {
      "field" : "title",
      "value" : "部落格"
  }
}
相當於
GET /blog_website/blogs/_search
{
  "query": { 
    "match" : { 
      "title" : "部落格" 
    } 
  }
}

2、toJson
以json格式傳入,設定search template
GET /blog_website/blogs/_search/template
{
  "inline": "{\"query\": {\"match\": {{#toJson}}matchCondition{{/toJson}}}}",
  "params": {
    "matchCondition": {
      "title": "部落格"
    }
  }
}
相當於
GET /blog_website/blogs/_search
{
  "query": { 
    "match" : { 
      "title" : "部落格" 
    } 
  }
}
3、join
一個field多值查詢,join關聯,設定search template
GET /blog_website/blogs/_search/template
{
  "inline": {
    "query": {
      "match": {
        "title": "{{#join delimiter=' '}}titles{{/join delimiter=' '}}"
      }
    }
  },
  "params": {
    "titles": ["部落格", "網站"]
  }
}
相當於
GET /blog_website/blogs/_search
{
  "query": { 
    "match" : { 
      "title" : "部落格 網站" 
    } 
  }
}
4、default value
初始化search template資料,params未傳values時候,使用初始化的預設資料查詢初始化搜尋資料
POST /blog_website/blogs/1/_update
{
  "doc": {
    "views": 5
  }
}
設定search template
GET /blog_website/blogs/_search/template
{
  "inline": {
    "query": {
      "range": {
        "views": {
          "gte": "{{start}}",
          "lte": "{{end}}{{^end}}20{{/end}}"
        }
      }
    }
  },
  "params": {
    "start": 1,
    "end": 10
  }
}
相當於
GET /blog_website/blogs/_search
{
  "query": {
    "range": {
      "views": {
        "gte": 1,
        "lte": 10
      }
    }
  }
}
設定search template,使用default value
GET /blog_website/blogs/_search/template
{
  "inline": {
    "query": {
      "range": {
        "views": {
          "gte": "{{start}}",
          "lte": "{{end}}{{^end}}20{{/end}}"
        }
      }
    }
  },
  "params": {
    "start": 1
  }
}
相當於
GET /blog_website/blogs/_search
{
  "query": {
    "range": {
      "views": {
        "gte": 1,
        "lte": 20
      }
    }
  }
}
5、conditional
條件查詢模版,設定search template
{
  "query": {
    "bool": {
      "must": {
        "match": {
          "line": "{{text}}" 
        }
      },
      "filter": {
        {{#line_no}} 
          "range": {
            "line_no": {
              {{#start}} 
                "gte": "{{start}}" 
                {{#end}},{{/end}} 
              {{/start}} 
              {{#end}} 
                "lte": "{{end}}" 
              {{/end}} 
            }
          }
        {{/line_no}} 
      }
    }
  }
}
相當於
GET /my_index/my_type/_search 
{
  "took": 4,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1,
    "hits": [
      {
        "_index": "my_index",
        "_type": "my_type",
        "_id": "1",
        "_score": 1,
        "_source": {
          "line": "我的部落格",
          "line_no": 5
        }
      }
    ]
  }
}

6、儲存search template
es的config/scripts目錄下,預先儲存這個複雜的模板,字尾名是.mustache,檔名是conditonal
在進行 條件 search template 查詢
GET /my_index/my_type/_search/template
{
  "file": "conditional",
  "params": {
    "text": "部落格",
    "line_no": true,
    "start": 1,
    "end": 10
  }
}
提供一個思路比如說,一般在大型的團隊中,可能不同的人,都會想要執行一些類似的搜尋操作這個時候,有一些負責底層運維的一些同學,就可以基於search template,封裝一些模板出來,然後是放在各個es程序的scripts目錄下的其他的團隊,其實就不用各個團隊自己反覆手寫複雜的通用的查詢語句了,直接呼叫某個搜尋模板,傳入一些引數就好了