Elasticsearch 之(36)使用search template將搜尋模板化
阿新 • • 發佈:2019-01-27
前言
搜尋模板,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 templateGET /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 valueGET /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目錄下的其他的團隊,其實就不用各個團隊自己反覆手寫複雜的通用的查詢語句了,直接呼叫某個搜尋模板,傳入一些引數就好了