Elasticsearch 搜索模板:重用和共享查询

在Elasticsearch(ES)的日常开发和运维中,我们经常会遇到需要频繁执行相似查询的场景。这些查询可能因业务逻辑的复杂性而涉及多个字段、过滤条件和聚合分析。为了优化这些操作,提高开发效率,Elasticsearch提供了搜索模板(Search Templates)的功能。本文将介绍如何使用Elasticsearch的搜索模板来重用和共享查询。

一、为什么使用搜索模板

在日常开发中,尽管大多数查询可能相对简单,但在一些复杂的业务场景(如金融、医药等)中,一次搜索可能需要传入或返回几十个字段,同时涉及复杂的过滤条件和聚合分析。此时,手动编写每个查询不仅效率低下,还容易出错。搜索模板就像MySQL中的存储过程或函数,只需定义一次,后续在代码中通过调用模板并传递参数即可完成搜索功能,极大地提高了开发效率和查询的灵活性。

二、搜索模板的入门案例

2.1 标准形式

搜索模板的基本形式是定义一个包含查询条件的JSON对象,并通过_search/template API调用。例如:

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

在这个例子中,{``{kw}}{``{size}}是模板中的变量,通过params对象传递具体的值。

2.2 toJSON形式

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

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

2.3 join方法传参

使用join方法可以将数组中的元素拼接成字符串,用于查询条件。例如:

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

2.4 默认值形式

在模板中可以为参数设置默认值,如果调用时没有传递该参数,则使用默认值。例如:

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

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

3.1 Elasticsearch保存template

为了重用模板,我们可以将其保存在Elasticsearch中。通过指定模板的名称,方便后续反复调用。例如:

json 复制代码
POST _scripts/my_test_template
{
  "script": {
    "lang": "mustache",
    "source": {
      "query": {
        "match": {
          "field_name": "{{kw}}"
        }
      }
    }
  }
}

3.2 调用template

调用模板时,通过id来指定具体的模板,并传递相应的参数。例如:

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

3.3 查询已定义的template

通过GET请求可以查询已定义的模板信息,例如:

json 复制代码
GET _scripts/my_test_template

3.4 删除已定义的template

如果需要删除已定义的模板,可以使用DELETE请求,例如:

json 复制代码
DELETE _scripts/my_test_template

四、搜索模板的高级应用

4.1 验证模板

Elasticsearch提供了_render/template API来验证模板。

相关推荐
SelectDB3 小时前
飞轮科技荣获中国电信星海大数据最佳合作伙伴奖!
大数据·数据库·数据分析
小刘鸭!3 小时前
Hbase的特点、特性
大数据·数据库·hbase
神奇侠20243 小时前
解决集群Elasticsearch 未授权访问漏洞
elasticsearch
Elastic 中国社区官方博客4 小时前
如何通过 Kafka 将数据导入 Elasticsearch
大数据·数据库·分布式·elasticsearch·搜索引擎·kafka·全文检索
神奇侠20244 小时前
解决单台Elasticsearch 未授权访问漏洞
elasticsearch
nece0014 小时前
elasticsearch 杂记
大数据·elasticsearch·搜索引擎
开心最重要(*^▽^*)4 小时前
Es搭建——单节点——Linux
大数据·elasticsearch
学计算机的睿智大学生5 小时前
Hadoop的生态系统所包含的组件
大数据·hadoop·分布式
武子康5 小时前
大数据-259 离线数仓 - Griffin架构 修改配置 pom.xml sparkProperties 编译启动
xml·java·大数据·hive·hadoop·架构
qiquandongkh6 小时前
期权懂|期权新手入门知识:如何挑选期权活跃合约?
大数据·区块链