ES学习记录11——搜索模板(Search Template)

本文介绍了Elasticsearch的搜索模板功能,包括如何使用mustache语言构造模板,处理查询参数,如连接数组值、设置默认值和使用条件语句。还讲解了多搜索模板的使用以及搜索碎片的概念和参数配置。
摘要由CSDN通过智能技术生成

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(下面是查询用户名为kimchy4kimchy3两个用户):

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索引中有kimchy1kimchy4kimchy,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中定义startend两个变量,比如:

  "params": {
   
      "start": 12,
      "end": 13
  }

那最终的查询参数最终为:

    "line_no": {
   
        "gte": "12",
        "lte": "13"
    }

但如果params中只定义了start变量࿰

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值