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

相关推荐
2401_883041083 小时前
新锐品牌电商代运营公司都有哪些?
大数据·人工智能
青云交3 小时前
大数据新视界 -- 大数据大厂之 Impala 性能优化:融合机器学习的未来之路(上 (2-1))(11/30)
大数据·计算资源·应用案例·数据交互·impala 性能优化·机器学习融合·行业拓展
Json_181790144806 小时前
An In-depth Look into the 1688 Product Details Data API Interface
大数据·json
Qspace丨轻空间8 小时前
气膜场馆:推动体育文化旅游创新发展的关键力量—轻空间
大数据·人工智能·安全·生活·娱乐
Elastic 中国社区官方博客9 小时前
如何将数据从 AWS S3 导入到 Elastic Cloud - 第 3 部分:Elastic S3 连接器
大数据·elasticsearch·搜索引擎·云计算·全文检索·可用性测试·aws
掘金-我是哪吒9 小时前
微服务mysql,redis,elasticsearch, kibana,cassandra,mongodb, kafka
redis·mysql·mongodb·elasticsearch·微服务
Aloudata10 小时前
从Apache Atlas到Aloudata BIG,数据血缘解析有何改变?
大数据·apache·数据血缘·主动元数据·数据链路
水豚AI课代表10 小时前
分析报告、调研报告、工作方案等的提示词
大数据·人工智能·学习·chatgpt·aigc
研究是为了理解11 小时前
Git Bash 常用命令
git·elasticsearch·bash
拓端研究室TRL13 小时前
【梯度提升专题】XGBoost、Adaboost、CatBoost预测合集:抗乳腺癌药物优化、信贷风控、比特币应用|附数据代码...
大数据