《深入理解Elasticsearch(原书第2版)》一2.3.1 引入查询模板

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介:

本节书摘来华章计算机《深入理解Elasticsearch(原书第2版)》一书中的第2章 ,第2.3.1节,[美]拉斐尔·酷奇(Rafal Ku) 马雷克·罗戈任斯基(Marek Rogoziski)著 张世武 余洪淼 商旦 译 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.3.1 引入查询模板

自Elasticsearch 1.1.0版本开始,我们可以自定义查询模板。让我们回到本书开头的在线书店例子中。假定我们已经确定了需要传递给Elasticsearch的查询语句的类型,不过查询结构并未最终确定,我们还需要对它进行微调和优化。通过使用查询模板,我们可以快速构建出查询的基础骨架,然后让应用程序来提供对应的参数,最终由Elasticsearch完成查询参数的替换。
假定我们有一个针对library索引的查询语句,可以返回最相关的书籍记录。在这个查询中,我们还允许用户选择是否对书籍的库存状态做筛选。在这个场景中,我们需要传入两个参数—一个查询短语和一个代表书籍库存状态的布尔变量。最初的简化示例如下:
image

代码中的QUERY和BOOLEAN是占位符,代表应用程序传递给查询的变量。显然这个查询语句对当前示例场景来说实在太简陋了,不过之前我们已经说过,这只是它的最初版本,我们马上将对它进行改进。
既然已经有了最初版本的查询语句,我们可以基于它创建第一个查询模板。对该查询语句做简单修改如下:
image
image

可以看出,原来的占位符被替换成了{{phrase}}和{{avail}}两个变量,并且添加了一个新的params片段。当Elasticsearch在解析查询语句时,遇到一个{{phrase}}变量,它将尝试从params片段中查找出名为phrase的参数,并用参数值替换掉{{phrase}}变量。通常,我们需要把参数值放到params片段中,并在query中使用形如{{var}}的标记来引用params片段中参数名为var的参数。此外,查询本身被嵌套进一个template元素中。通过这种方式,我们实现了查询的参数化。
接下来让我们使用HTTP GET请求把以下查询语句发送给地址为/library/_search/template的REST端点(注意这里不是我们通常使用的/library/_search端点)。请求命令构造如下:
image

字符串形式的查询模板
查询模板也可以以字符串的形式提供。比如,刚才的查询模板可以变成这样:
image

可见,这种形式不太适合阅读和书写,每个引号都需要被转义,换行符容易引发格式问题,因此需要避免使用。尽管如此,如果你需要使用Mustache(一个模板引擎,我们将在下一小节探讨),则必须使用这种格式(至少在Elasticsearch的1.1.0到1.4.0之间的所有版本中必须这样做)。
 本书写作时,笔者所使用的Elasticsearch相关版本中有一个关于查询模板的小陷阱。如果你提供的查询模板中有错误,被Elasticsearch检测到后,会把错误写到服务日志里,但是从API的视角来看,错误查询将被忽略,接口将返回所有文档,就好像你刚刚发送了一个match_all查询一样。记得复查你的查询模板,直到这个缺陷不再存在。

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
3月前
|
存储 固态存储 Java
Elasticsearch中查询性能优化
Elasticsearch中查询性能优化
198 0
|
3天前
|
存储 SQL 运维
Elasticsearch 查询革新:探索 Wildcard 类型的高效模糊匹配策略
Elasticsearch 查询革新:探索 Wildcard 类型的高效模糊匹配策略
16 0
|
3天前
|
运维 测试技术 数据处理
Elasticsearch 优化查询中获取字段内容的方式,性能提升5倍!
Elasticsearch 优化查询中获取字段内容的方式,性能提升5倍!
14 0
|
3天前
|
存储 缓存 Java
Elasticsearch 8.X 聚合查询下的精度问题及其解决方案
Elasticsearch 8.X 聚合查询下的精度问题及其解决方案
9 0
|
15天前
|
自然语言处理 Java 索引
SpringBoot 实现 elasticsearch 查询操作(RestHighLevelClient 的案例实战)
SpringBoot 实现 elasticsearch 查询操作(RestHighLevelClient 的案例实战)
20 1
|
3月前
|
缓存 算法 索引
【Elasticsearch专栏 07】深入探索:Elasticsearch的倒排索引如何进行模糊查询和通配符查询
Elasticsearch的倒排索引支持模糊查询和通配符查询,通过特定的算法和数据结构,能够实现对关键词的模糊匹配和通配符匹配。这两种查询类型提供了更灵活的搜索功能,但可能影响查询性能,需结合优化策略使用。
|
3月前
|
缓存 自然语言处理 数据挖掘
一篇文章让你学会Elasticsearch中的查询
一篇文章让你学会Elasticsearch中的查询
137332 118
|
3月前
|
测试技术 定位技术 API
万字长文:一文彻底搞懂Elasticsearch中Geo数据类型查询、聚合、排序
万字长文:一文彻底搞懂Elasticsearch中Geo数据类型查询、聚合、排序
94623 140
|
3月前
|
JSON 前端开发 API
【Elasticsearch】搜索结果处理和RestClient查询文档
【Elasticsearch】搜索结果处理和RestClient查询文档
343 0
|
3月前
|
JSON 自然语言处理 算法
【Elasticsearch】DSL查询文档
【Elasticsearch】DSL查询文档
318 0

热门文章

最新文章