Elasticsearch-94-search template搜索模板化

简介

search template 搜索模板,可以将一些常用的搜索模板化,每次要执行这个搜索的时候,就直接调用模板,然后传入参数就好了

入门

先写一个简单的模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
GET /blog_website/blogs/_search/template
{
"inline":{
"query":{
"match":{
"{{field}}" : "{{value}}"
}
}
},
"params": {
"field":"title",
"value":"博客"
}
}

inline 里面是模板,然后params里面传去参数里面是参数名

上面这个请求es会翻译成这样的

1
2
3
4
5
6
7
8
GET /blog_website/blogs/_search
{
"query": {
"match" : {
"title" : "博客"
}
}
}

toJson

1
2
3
4
5
6
7
8
9
GET /blog_website/blogs/_search/template
{
"inline":"{\"query\":{\"match\":{{#toJson}}matchCondition{{/toJson}}}}",
"params": {
"matchCondition":{
"title":"博客"
}
}
}

把对象类型的参数放进去

经过es转换后,会转为

1
2
3
4
5
6
7
8
GET /blog_website/blogs/_search
{
"query": {
"match" : {
"title" : "博客"
}
}
}

join

1
2
3
4
5
6
7
8
9
10
11
12
13
GET /blog_website/blogs/_search/template
{
"inline" : {
"query" :{
"match":{
"title": "{{#join delimiter=' '}}titles{{/join delimiter=' '}}"
}
}
},
"params": {
"titles":["博客","网站"]
}
}

将下面参数传入的数组用delimiter设置的值拼接起来

es转换后:

1
2
3
4
5
6
7
8
GET /blog_website/blogs/_search
{
"query": {
"match" : {
"title" : "博客 网站"
}
}
}

default value

加一个数据用来测试

1
2
3
4
5
6
POST /blog_website/blogs/1/_update
{
"doc": {
"views": 5
}
}

模板:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
GET blog_website/blogs/_search/template
{
"inline":{
"query":{
"range":{
"views":{
"gte":"{{start}}",
"lte":"{{end}}{{^end}}20{{/end}}"
}
}
}
},
"params": {
"start":1,
"end":10
}
}

就是,有传值的话就按传的值去搜索,不传值的话,就是按照设置的默认值来搜索,比如上面模板中的end,如果不传值的话就是默认的20

es转换后:

1
2
3
4
5
6
7
8
9
10
11
GET /blog_website/blogs/_search
{
"query": {
"range": {
"views": {
"gte": 1,
"lte": 20
}
}
}
}

conditional

这里要去es的config/scripts目录下,预先把模板保存下来,这里文件名是conditonal,后缀名是.mustache

文件内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{
"query": {
"bool": {
"must": {
"match": {
"line": "{{text}}"
}
},
"filter": {
{{#line_no}}
"range": {
"line_no": {
{{#start}}
"gte": "{{start}}"
{{#end}},{{/end}}
{{/start}}
{{#end}}
"lte": "{{end}}"
{{/end}}
}
}
{{/line_no}}
}
}
}
}

添加一条数据做测试:

1
2
3
4
5
PUT my_index/my_type/1
{
"line": "我的博客",
"line_no": 5
}

模板保存好了之后,去调用这个模板,传参,查询

1
2
3
4
5
6
7
8
9
10
GET /my_index/my_type/_search/template
{
"file": "conditional",
"params": {
"text": "博客",
"line_no": true,
"start": 1,
"end": 10
}
}

返回值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.5753642,
"hits": [
{
"_index": "my_index",
"_type": "my_type",
"_id": "1",
"_score": 0.5753642,
"_source": {
"line": "我的博客",
"line_no": 5
}
}
]
}
}

模板里有一个参数是list_no,然后底下调用的时候传了true,就会走filter里面的range,就跟mybaits里面的判空,然后加一个搜索条件是类似的

模板保存

以上所有的模板,都可以保存到config/scripts目录下,模板文件必须是.mustache结尾的,然后调用的时候就是上面那样调用就好了

使用场景:可能在项目开发过程中,有很多人都会执行一些类似的操作,这时候就可以封装成模板,然后每个人使用的时候传入参数就可以了