Elasticsearch 搜索模板详解

一. 为什么使用搜索模板

日常开发时,通常我们都不需要使用搜索模板,但如果遇到非常复杂的业务场景,如金融、医药等,可能一次搜索需要传入或返回几十个字段,搜索几百个field、过滤条件、聚合分析等逻辑非常复杂,此时搜索模板就派上用场了。搜索模板就像Mysql中的procedure、function那样,只需要使用比如kibana访问ES,定义一次搜索模板,后续在代码中调用模板并传参即可完成搜索功能。

二. template入门案例

本入门案例中定义的搜索模板仅在一次查询调用时生效,没有让Elsticsearch保存(记忆)搜索模板,至于如何创建能让ES记忆的搜索模板,可以看本文第三节。
“source” 代表搜索模板,内含要执行的search语句
"params"是需要向模板中传递的变量。
{{变量名}}用于定义模板中的变量参数。

2.1 标准形式

不难发现,如果去掉"source"标签,实际上这就是一个标准的搜索条件语句。

GET /index_name/_search/template
{
  "source": {
    "query": {
      "match": {
        "remark": "{{kw}}"
      }
    },
    "size": "{{size}}"
  },
  "params": {
    "kw": "真正的数值",
    "size": 100
  }
}

2.2 toJson形式

toJSON形式的特点在于,source使用字符串来定义。注意: source内需要用到转义字符。

GET cars/_search/template
{
  "source": "{ \"query\": { \"match\": {{#toJson}}parameter{{/toJson}} }}",
  "params": {
    "parameter" : {
      "remark" : "真正的数值"
    }
  }
}

2.3 join方法传参

join方式传入的是数组,让Elasticsearch来进行数据的拼接。

GET index_name/_search/template
{
  "source" : {
    "query" : {
      "match" : {
        "remark" : "{{#join delimiter=' '}}kw{{/join delimiter=' '}}"
      }
    }
  },
  "params": {
    "kw" : ["大众", "标致", "奔驰", "宝马"]
  }
}

等价于"remark": “大众 标志 奔驰 宝马”。

2.4 default value形式

以下语句中,^end表示为end这个参数设置了默认值。如果在params中传递了end,则使用传递的数值,如果没有传递end,则使用默认的数值。

GET index_name/_search/template
{
  "source" : {
    "query" : {
      "range" : {
        "price" : {
          "gte" : "{{start}}",
          "lte" : "{{end}}{{^end}}200000{{/end}}"
        }
      }
    }
  },
  "params": {
    "start" : 100000
  }
}

三. 记忆template并实现重复调用

3.1 Elasticsearch保存template

必须指定template的名称,方便后续反复调用。

POST _scripts/my_test_template
{
  "script": {
    "lang": "mustache",
    "source": {
      "query": {
        "match": {
          "field_name": "{{kw}" 
        }
      }
    }
  }
}

3.2 调用 template

调用template时,通过id来指定具体的template。

GET index_name/_search/template
{
  "id": "my_test_template",
  "params": {
    "kw": "自定义template的参数值"
  }
}

3.3 查询已定义的template

GET _scripts/template_name

3.4 删除已定义的template

DELETE _scripts/template_name
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值