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

2.3.1 引入查询模板

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

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

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

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

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

时间: 2024-10-01 18:22:34

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

《深入理解Elasticsearch(原书第2版)》——2.3 查询模板

2.3 查询模板 在应用程序迭代的同时,它的运行环境很可能会越来越复杂.在你所处的组织中,很可能同一个应用程序的不同部分分别有专人负责,比如说,至少有一个前端工程师和一个负责数据库层的后端工程师.将应用程序划分为几个模块分别开发的方式非常便捷高效,它能够让开发人员针对程序的不同部分并行进行开发工作,而无需在开发者之间和开发小组内部时刻同步代码.当然,你正在阅读的这本书不是关于项目管理的,而是聚焦于搜索的,因此让我们回到正题上.有时候,我们可以整理出程序使用的所有查询语句交给搜索引擎工程师,让他们

《深入理解Elasticsearch(原书第2版)》——第2章 查询DSL进阶 2.1 Apache Lucene默认评分公式解释

第2章 查询DSL进阶 在上一章,我们了解了什么是Apache Lucene,它的整体架构,以及文本分析过程是如何完成的.之后,我们还介绍了Lucene的查询语言及其用法.除此之外,我们也讨论了Elasticsearch,讨论了它的架构,以及一些核心概念.在本章,我们将深入研究Elasticsearch的查询DSL(Domain Specific Language).在了解那些高级查询之前,我们将先了解Lucene评分公式的工作原理.到本章结束,将涵盖以下内容: Lucene默认评分公式是如何工

《深入理解Elasticsearch(原书第2版)》——2.2 查询改写

2.2 查询改写 之前我们探讨了评分机制,这些知识非常珍贵,特别是当你尝试改进查询相关性时.我们还认为,在对查询进行调试时,也很有必要搞清楚查询是如何执行的.因此我们决定在本节介绍一下查询改写是如何工作的,为什么需要查询改写,以及我们应该如何控制它. 如果你之前使用过诸如前缀查询或通配符查询之类的查询类型,那么你会了解这些都是基于多词项的查询,它们都涉及查询改写.Elasticsearch使用查询改写是出于对性能的考虑.从Lucene的角度来看,所谓的查询改写操作,就是把费时的原始查询类型实例改

《语义网基础教程(原书第3版)》—— 第3章 查询语义网

第3章 查询语义网 在上一章中,我们学会了如何使用RDF来表示知识.当信息被表示为RDF后,出于推理和应用开发的需要,我们需要能够存取其中相关的部分.在本章中,我们将把注意力集中于一个叫做SPARQL的查询语言,它能够让我们通过选择.抽取等方式很容易地从被表示为RDF的知识中获得特定的部分.SPARQL是专为RDF设计的,适合并依赖于万维网上的各种技术.如果你熟悉诸如SQL等数据库查询语言,你会发现SPARQL和它们有很多相似之处.即便你不熟悉-本章也不假设你已熟悉,本章将为你从头开始学习提供一

《语义网基础教程(原书第3版)》—— 3.7 查询模式

3.7 查询模式 重要的是,因为模式(schema)信息是用RDF表示的,SPARQL可以用来查询关于模式本身的信息.例如,以下是上一章中住房本体的一部分. 使用SPARQL,通过同时查询实例数据和模式(schema),我们可以确定数据集中的Residential Units: 注意,我们使用了与Turtle相同的缩写法:用a来表示rdf:type.对模式的查询能力是SPARQL和RDF的一项重要能力,因为它不仅允许检索信息,还可以查询信息的语义.

《深入理解Elasticsearch(原书第2版)》一导读

前 言 欢迎来到Elasticsearch的世界并阅读本书第2版.通过阅读本书,我们将带领你接触与Elasticsearch紧密相关的各种话题.请注意,本书不是为初学者写的.笔者将本书作为<Elasticsearch Server, Second Edition>的续作和姊妹篇.相对于<Elasticsearch Server>,本书涵盖了很多新知识,不过你偶尔也可以在本书中发现一些引自<Elasticsearch Server>的内容. 本书将探讨与Elasticse

《深入理解Elasticsearch(原书第2版)》——导读

前 言 欢迎来到Elasticsearch的世界并阅读本书第2版.通过阅读本书,我们将带领你接触与Elasticsearch紧密相关的各种话题.请注意,本书不是为初学者写的.笔者将本书作为<Elasticsearch Server, Second Edition>的续作和姊妹篇.相对于<Elasticsearch Server>,本书涵盖了很多新知识,不过你偶尔也可以在本书中发现一些引自<Elasticsearch Server>的内容. 本书将探讨与Elasticse

《机器学习与R语言(原书第2版)》一2.3 探索和理解数据

本节书摘来自华章出版社<机器学习与R语言(原书第2版)>一书中的第2章,第2.3节,美] 布雷特·兰茨(Brett Lantz) 著,李洪成 许金炜 李舰 译更多章节内容可以访问"华章计算机"公众号查看. 2.3 探索和理解数据 在收集数据并把它们载入R数据结构以后,机器学习的下一个步骤是仔细检查数据.在这个步骤中,你将开始探索数据的特征和案例,并且找到数据的独特之处.你对数据的理解越深刻,你将会更好地让机器学习模型匹配你的学习问题. 理解数据探索的最好方法就是通过例子.在

《机器学习与R语言(原书第2版)》一 第2章 数据的管理和理解

本节书摘来自华章出版社<机器学习与R语言(原书第2版)>一书中的第2章,第2.1节,美] 布雷特·兰茨(Brett Lantz) 著,李洪成 许金炜 李舰 译更多章节内容可以访问"华章计算机"公众号查看. 第2章 数据的管理和理解 任何机器学习项目初期的核心部分都是与管理和理解所收集的数据有关的.尽管你可能发现这些工作不像建立和部署模型那样令人有成就感(建立和部署模型阶段就开始看到了劳动的成果),但是忽视这些重要的准备工作是不明智的.任何学习算法的好坏取决于输入数据的好坏.