欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Elasticsearch 搜索模板详解

程序员文章站 2022-07-05 14:48:27
...

一. 为什么使用搜索模板

日常开发时,通常我们都不需要使用搜索模板,但如果遇到非常复杂的业务场景,如金融、医药等,可能一次搜索需要传入或返回几十个字段,搜索几百个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