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

相关推荐
龙亘川4 分钟前
数智赋能退役军人服务:V1.0 系统搭建全生命周期闭环服务体系
大数据·数据库·人工智能
Tongzhi20261 小时前
通芝科技考勤软件三大发展趋势:AI大模型、无感识别与数据底座
大数据·科技·算法·爬山算法
智购科技自动售卖机厂家1 小时前
2026自动售货机库存热力图分析:从设备分布到补货优先级的数据可视化实践~YH
大数据·python·信息可视化
SelectDB技术团队2 小时前
Apache Doris 5.0 年度版本前瞻(一):构建统一的多模湖仓实时分析平台
大数据·doris·数据湖·湖仓一体·lakehouse·湖仓分析·多模分析
eBest数字化转型方案2 小时前
Route Optimization for FMCG:多目标排线算法的工程实现
大数据·人工智能·算法
Han.miracle2 小时前
Elasticsearch深度分页问题完整解析
大数据·elasticsearch·搜索引擎
小柯南敲键盘2 小时前
跨境电商批量图片翻译与视频字幕翻译,就用跨马AI工具
大数据·人工智能·python·音视频
GlobalInfo2 小时前
正文回答“是什么”,附录回答“为什么是这样”
大数据·人工智能
数字孪生视频孪生2 小时前
空间智能技术|跨镜轨迹全域可溯,无感定位无扰赋能落地
大数据·运维·人工智能·重构·架构
深海鱼肝油ya2 小时前
向量数据库Elasticsearch(一)
人工智能·elasticsearch·向量数据库·es数据库增加索引·es数据库相似度查询·knn查询