1. 搜索模板
/_search/template
端点允许使用mustache language(继承ES沙箱脚本语言的一种语言,是护胡言乱语吗……)为每个呈现搜索请求,在执行前和用模板参数填充现有的模板:
curl -X GET "localhost:9200/_search/template" -H 'Content-Type: application/json' -d'
{
"source" : {
"query": {
"match" : {
"{
{my_field}}" : "{
{my_value}}" } },
"size" : "{
{my_size}}"
},
"params" : {
"my_field" : "message",
"my_value" : "some message",
"my_size" : 5
}
}
'
执行这个请求时,ES卡住没有响应,一直处于loading的状态。
模板样例
用单值填充查询字符串
curl -X GET "localhost:9200/_search/template" -H 'Content-Type: application/json' -d'
{
"source": {
"query": {
"term": {
// 使用占位符的方式{
{xxx}}使用一个变量
"user": "{
{query_string}}"
}
}
},
"params": {
// 定义上述使用到的变量
"query_string": "kimchy3"
}
}
'
转换参数成JSON
{
{#toJson}}parameter{
{/toJson}}
函数可以用来将map或数组的参数parameter
转换成对应的JSON(下面是查询用户名为kimchy4
和kimchy3
两个用户):
curl -X GET "localhost:9200/_search/template" -H 'Content-Type: application/json' -d'
{
// 将变量users转成对应的JSON
"source": "{ \"query\": { \"terms\": {
{#toJson}}users{
{/toJson}} }}",
"params": {
// 将users变量填充到上面的函数中
"users" : {
"user": [ "kimchy4", "kimchy3" ]
}
}
}
'
最终的转换结果(但是实际是看不到的)为:
// 转成JSON串
"query": {
"terms": {
"users": {
"user": [
"kimchy4",
"kimchy3"
]
}
}
}
连接数组的值
{
{#join}}array{
{/join}}
函数可以用来将数组array
内的元素连接为一个用逗号,
分隔的字符串(twitter
索引中有kimchy1
…kimchy4
、kimchy,5
五个文档),下面是一个栗子:
curl -X GET "localhost:9200/_search/template" -H 'Content-Type: application/json' -d'
{
"source": {
"query": {
"match": {
"user": "{
{#join}}user{
{/join}}"
}
}
},
"params": {
"user": [ "kimchy", "5" ]
}
}
'
这样最终传入的user
变量为kimchy,5
(由数组[ "kimchy", "5" ]
转成kimchy,5
),即直接去匹配了。上述是使用默认的分隔符(即逗号,
)来连接数组各个元素,当前这个分隔符也可以自定义,使用自定义分隔符函数{
{#join delimiter='xx'}}date.formats{
{/join delimiter='xx'}}
即可将默认的,
改为||
,比如:
curl -X GET "localhost:9200/_search/template" -H 'Content-Type: application/json' -d'
{
"source": {
"query": {
"range": {
"born": {
"gte" : "{
{date.min}}",
"lte" : "{
{date.max}}",
// 将原来逗号的分隔符改为双竖杠||
"format": "{
{#join delimiter='||'}}date.formats{
{/join delimiter='||'}}"
}
}
}
},
"params": {
"date": {
"min": "2016",
"max": "31/12/2017",
"formats": ["dd/MM/yyyy", "yyyy"]
}
}
}
'
born
最终的转换为:
"born" : {
"gte" : "2016",
"lte" : "31/12/2017",
"format" : "dd/MM/yyyy||yyyy"
}
默认值
默认值的写法为:{
{var}}{
{^var}}default{
{/var}}
,下面是小栗子:
curl -X GET "localhost:9200/_search/template" -H 'Content-Type: application/json' -d'
{
"source": {
"query": {
// 查询范围内获赞数的文档
"range": {
// 指定按获赞数进行筛选
"likes": {
// 获赞数的下限
"gte": "{
{start}}",
// 获赞数的上限
"lte": "{
{end}}{
{^end}}20{
{/end}}"
}
}
}
},
"params": {
...
}
}
'
如果params
中定义start
和end
两个变量,比如:
"params": {
"start": 12,
"end": 13
}
那最终的查询参数最终为:
"line_no": {
"gte": "12",
"lte": "13"
}
但如果params
中只定义了start
变量