正如我们在 下载和安装 Elasticsearch 第 1 章,入门,您需要安装并运行 Elasticsearch 来执行当前的配方代码。
要执行以下部分中的代码,可以使用任何 HTTP 客户端。这包括 curl (https://curl.haxx.se/)、Postman (https://www.getpostman.com/),或其他类似版本。我建议使用 Kibana 控制台,因为这为 Elasticsearch 提供了代码完成和更好的字符转义。
要正确执行以下命令,您需要使用在线提供的 ch04/populate_kibana.txt 命令填充的索引代码。
本秘籍中使用的索引是 mybooks-join、 和统一建模语言(UML)的数据模型如下:
要执行 has_child 查询,我们将执行以下步骤:
- We want to search the parent book of the children author, which has a term in the name field called martin. We can create this kind of query using the following code:
- If everything is working well, the result returned by Elasticsearch should be as follows:
对于这个例子,我们使用了 inner_hits 来返回匹配的孩子。
这种查询通过返回其子项与查询匹配的父文档来工作。查询可以是任何类型。这种查询的前提是子节点必须在其父节点的分片中正确索引。在内部,这种查询是在children上执行的,所有children的ID都用于过滤parent。系统必须有足够的内存来存储子 ID。
用于控制此过程的参数如下:
- The type parameter describes the type of children. This type is part of the same index of the parent: it's the name provided in the join field parameter at index time.
- The query parameter can be executed for selection of the children. Any kind of query can be used.
- If defined, the score_mode parameter (the default is none; available values are max, sum, avg, and none) allows you the aggreagate the children scores with the parent ones.
- min_children and max_children are optional parameters. This is the minimum/maximum number of children that are required to match the parent document.
- ignore_unmapped (default false), when set to true, will ignore unmapped types. This is very useful when executing a query on multiple indices and some types are missing. The default behavior is to throw an exception if there is a mapping error.
在 Elasticsearch 中,一个文档必须只有一个父级,因为父级 ID 用于选择将子级放入的分片。处理子级文档时,请务必记住,它们必须与父级存储在同一个分片中。如果路由未知,则在获取、修改和删除它们时必须采取特殊的预防措施。
由于父子关系可以被认为类似于标准 SQL 中的外键,因此由于 Elasticsearch 的分布式特性,存在一些限制。这包括以下内容:
- There must be only one parent for each type
- The join part of child or parent is done in a shard and not distributed on all the clusters to reduce networking and increase performance
有时,您需要根据子字段对父母进行排序。为此,您需要通过查看子字段的最高分数来对父项进行排序。要执行这种查询,您可以通过以下方式使用 function_score 查询:
通过对父项的每个子项执行此查询,获取最大分数(使用 function_score),这是我们要排序的字段的值。
在前面的示例中,我们使用了脚本,这将在 第 9 章,管理集群中讨论。这需要处于活动状态才能使用。