ES Search Template(上)

简介: ES Search Template

Search Template

所谓 search template 搜索模板其实就是:

1.预先定义好查询语句 DSL 的结构并预留参数2.搜索的时再传入参数值3.渲染出完整的 DSL ,最后进行搜索

使用搜索模板可以将 DSL 从应用程序中解耦出来,并且可以更加灵活的更改查询语句。

例如:

GET _search/template
{
  "source" : {
    "query": {
      "match" : {
        "{{my_field}}" : "{{my_value}}"
      }
    }
  },
  "params" : {
    "my_field" : "message",
    "my_value" : "foo"
  }
}

构造出来的 DSL 就是:

{
  "query": {
    "match": {
      "message": "foo"
    }
  }
}

在模板中通过 {{ }} 的方式预留参数,然后查询时再指定对应的参数值,最后填充成具体的查询语句进行搜索。


搜索模板 API

为了实现搜索模板和查询分离,我们首先需要单独保存和管理搜索模板。

保存搜索模板

使用 scripts API 保存搜索模板(不存在则创建,存在则覆盖)。示例:

POST _scripts/<templateid>
{
  "script": {
    "lang": "mustache",
    "source": {
      "query": {
        "match": {
          "title": "{{query_string}}"
        }
      }
    }
  }
}

查询搜索模板

GET _scripts/<templateid>

删除搜索模板

DELETE _scripts/<templateid>

使用搜索模板

示例:

GET _search/template
{
  "id": "<templateid>",
  "params": {
    "query_string": "search words"
  }
}

params 中的参数与搜索模板中定义的一致,上文保存搜索模板的示例是 {{query_string}},所以这里进行搜索时对应的参数就是 query_string

检验搜索模板

有时候我们想看看搜索模板输入了参数之后渲染成的 DSL 到底长啥样。

示例:

GET _render/template
{
  "source": "{ \"query\": { \"terms\": {{#toJson}}statuses{{/toJson}} }}",
  "params": {
    "statuses" : {
        "status": [ "pending", "published" ]
    }
  }
}

返回的结果就是:

{
  "template_output": {
    "query": {
      "terms": {
        "status": [
          "pending",
          "published"
        ]
      }
    }
  }
}

{{#toJson}} {{/toJson}} 就是转换成 json 格式。/


已经保存的搜索模板可以通过以下方式查看渲染结果:

GET _render/template/<template_name>
{
  "params": {
    "..."
  }
}

使用 explainprofile 参数


示例:

GET _search/template
{
  "id": "my_template",
  "params": {
    "status": [ "pending", "published" ]
  },
  "explain": true
}
GET _search/template
{
  "id": "my_template",
  "params": {
    "status": [ "pending", "published" ]
  },
  "profile": true
}

模板渲染

填充简单值

GET _search/template
{
  "source": {
    "query": {
      "term": {
        "message": "{{query_string}}"
      }
    }
  },
  "params": {
    "query_string": "search words"
  }
}

对应的 DSL 就是:

{
  "query": {
    "term": {
      "message": "search words"
    }
  }
}

将参数转换为 JSON

使用 {{#toJson}}parameter{{/toJson}} 会将参数转换为 JSON。

GET _search/template
{
  "source": "{ \"query\": { \"terms\": {{#toJson}}statuses{{/toJson}} }}",
  "params": {
    "statuses" : {
        "status": [ "pending", "published" ]
    }
  }
}

对应的 DSL 就是:

{
  "query": {
    "terms": {
      "status": [
        "pending",
        "published"
      ]
    }
  }
}

对象数组的渲染示例:

GET _search/template
{
  "source": "{\"query\":{\"bool\":{\"must\": {{#toJson}}clauses{{/toJson}} }}}",
  "params": {
    "clauses": [
      { "term": { "user" : "foo" } },
      { "term": { "user" : "bar" } }
    ]
  }
}

渲染结果就是:

{
  "query": {
    "bool": {
      "must": [
        { "term": { "user" : "foo" } },
        { "term": { "user" : "bar" } }
      ]
    }
  }
}

将数组 join 成字符串

使用 {{#join}}array{{/join}} 可以将数组 join 成字符串。

示例:

GET _search/template
{
  "source": {
    "query": {
      "match": {
        "emails": "{{#join}}emails{{/join}}"
      }
    }
  },
  "params": {
    "emails": [ "aaa", "bbb" ]
  }
}

渲染结果:

{
  "query" : {
    "match" : {
      "emails" : "aaa,bbb"
    }
  }
}

除了默认以 , 分隔外,还可以自定义分隔符,示例:

{
  "source": {
    "query": {
      "range": {
        "born": {
          "gte": "{{date.min}}",
          "lte": "{{date.max}}",
          "format": "{{#join delimiter='||'}}date.formats{{/join delimiter='||'}}"
        }
      }
    }
  },
  "params": {
    "date": {
      "min": "2016",
      "max": "31/12/2017",
      "formats": [ "dd/MM/yyyy", "yyyy" ]
    }
  }
}

例子中的 {{#join delimiter='||'}} {{/join delimiter='||'}} 意思就是进行 join 操作,分隔符设置为 || ,渲染结果就是:

{
  "query": {
    "range": {
      "born": {
        "gte": "2016",
        "lte": "31/12/2017",
        "format": "dd/MM/yyyy||yyyy"
      }
    }
  }
}
目录
相关文章
|
存储 SQL JSON
Elasticsearch Search API之搜索模板(search Template)
Elasticsearch Search API之搜索模板(search Template)
Elasticsearch Search API之搜索模板(search Template)
|
5月前
|
XML API 数据格式
深入研究:亚马逊amazon商品详情API接口Python攻略
亚马逊商品详情API(Product Advertising API)让开发者以编程方式获取亚马逊商品信息,如标题、价格、库存、评价等。功能涵盖商品基本信息、购买属性、用户反馈、分类与促销信息。使用时需选择端点(如ItemLookup或ItemSearch)、构建请求、发送至服务器并处理响应数据(JSON/XML格式),同时做好错误处理。适合电商应用开发与数据分析。
|
11月前
|
机器学习/深度学习 数据可视化 大数据
机器学习与大数据分析的结合:智能决策的新引擎
机器学习与大数据分析的结合:智能决策的新引擎
618 15
|
消息中间件 Cloud Native Java
带你读《2022龙蜥社区全景白皮书》——5.4.2 Alibaba Dragonwell
带你读《2022龙蜥社区全景白皮书》——5.4.2 Alibaba Dragonwell
500 90
|
缓存 监控 Java
Java虚拟机(JVM)性能调优实战指南
在追求软件开发卓越的征途中,Java虚拟机(JVM)性能调优是一个不可或缺的环节。本文将通过具体的数据和案例,深入探讨JVM性能调优的理论基础与实践技巧,旨在为广大Java开发者提供一套系统化的性能优化方案。文章首先剖析了JVM内存管理机制的工作原理,然后通过对比分析不同垃圾收集器的适用场景及性能表现,为读者揭示了选择合适垃圾回收策略的数据支持。接下来,结合线程管理和JIT编译优化等高级话题,文章详细阐述了如何利用现代JVM提供的丰富工具进行问题诊断和性能监控。最后,通过实际案例分析,展示了性能调优过程中可能遇到的挑战及应对策略,确保读者能够将理论运用于实践,有效提升Java应用的性能。 【
523 10
|
存储 监控 数据可视化
性能测试:主流性能剖析工具介绍
**性能剖析**是识别应用性能瓶颈的关键,涉及指标收集、热点分析、优化建议及可视化报告。常用工具有:**JConsole**监控JVM,**VisualVM**多合一分析,**JStack**分析线程,**FlameGraph**展示CPU耗时,**SkyWalking**分布式跟踪,**Zipkin**追踪服务延迟。这些工具助力开发人员提升系统响应速度和资源效率。
|
消息中间件 监控 Java
您是否已集成 Spring Boot 与 ActiveMQ?
您是否已集成 Spring Boot 与 ActiveMQ?
375 0
|
存储 并行计算 大数据
优化Python数据处理性能的最佳实践
在数据科学和大数据时代,优化Python数据处理性能变得至关重要。通过探讨数据处理瓶颈、内存管理、并行计算以及高效库的使用,本篇文章旨在提供切实可行的最佳实践,以帮助开发者提升数据处理效率。
|
监控 网络协议 安全
Socks5协议原理分析及实现对比与问题排查实践
这篇文章《socks5协议原理分析及实现对比与问题排查实践》将深入探讨Socks5协议的工作原理,并对其与其他网络协议的实现进行详细比较。作者还将分享在实际应用过程中所遇到的问题及排查方法。对于想要提高系统安全性和性能的开发人员,本文提供了丰富的案例分析与实践经验。 在这篇文章中,读者将了解Socks5协议的基本概念、工作原理、具体实现方式以及常见问题与解决方案。这不仅有助于开发人员更好地理解Socks5协议,还能增强他们在开发与部署中应对复杂网络环境的能力,让我们一同探讨这些关键技术。
Socks5协议原理分析及实现对比与问题排查实践