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来验证模板。

相关推荐
合众恒跃11 分钟前
RK3588 + RK182X 双芯异构边缘计算方案:部署流程与实测性能解析
大数据·人工智能·科技·编辑器·etl工程师
百胜软件@百胜软件14 分钟前
AI大促之后:618的三大启示与双11的三大预判
大数据·人工智能·零售
明航咨询—张老师10 小时前
软考软件评测师技术深度剖析:2026年考试改革后的知识体系与备考架构
大数据·架构
千桐科技11 小时前
qData 数据中台开源版从 MySQL 到 Doris完成一次数据同步
大数据·mysql·开源·doris·数据中台·qdata
ACP广源盛1392462567314 小时前
GSV6155@ACP# 搭配 AI 服务器、AI PC 完整适配方案
大数据·服务器·人工智能·分布式·单片机·嵌入式硬件
stonewl259915 小时前
2026化工行业 GHS/CLP 国产标签打印软件合规打印方案
大数据·人工智能·物联网
Wzx19801215 小时前
Redis&ES——Retriever的抽象实现
数据库·人工智能·redis·elasticsearch
xywww16815 小时前
AWS 账号权限怎么分:根用户和 IAM 用户区别及日常使用建议
大数据·开发语言·人工智能·python·gpt·云计算·aws
Quincy_Freak16 小时前
SQLiteGo V2.3 版本更新说明
大数据·数据库·sqlite·数据库管理·大数据分析·sqlitego
牛奶咖啡1316 小时前
大数据Hadoop运维应用实践——双NameNode高可用Hadoop集群架构(下)
大数据·hadoop·hadoop集群配置文件解析·hadoop高可用集群安装部署·配置指定多台服务器相互免密·配置hadoop服务开机自启·ansible部署hadoop