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目录下的
其他的团队,其实就不用各个团队自己反复手写复杂的通用的查询语句了,直接调用某个搜索模板,传入一些参数就好了