不幸的是,没有(至少现在还没有)。
ElasticSearch 中的查询仅识别哪些文档与查询匹配以及它们匹配的程度。
要了解嵌套文档的用途,请考虑以下示例:
{
"title": "My post",
"body": "Text in my body...",
"followers": [
{
"name": "Joe",
"status": "active"
},
{
"name": "Mary",
"status": "pending"
},
]
}
上面的 JSON 一旦在 ES 中建立了索引,在功能上就等同于以下内容。请注意如何followers
场已被展平:
{
"title": "My post",
"body": "Text in my body...",
"followers.name": ["Joe","Mary"],
"followers.status": ["active","pending"]
}
搜索:followers with status == active and name == Mary
会错误地匹配此文档。
嵌套字段使我们能够解决这个限制。如果followers
字段被声明为类型nested
而不是类型object
然后其内容在内部创建为单独的(不可见的)子文档。这意味着我们可以使用嵌套查询 http://www.elasticsearch.org/guide/reference/query-dsl/nested-query.html or 嵌套过滤器 http://www.elasticsearch.org/guide/reference/query-dsl/nested-filter.html将这些嵌套文档作为单独的文档进行查询。
但是,嵌套查询/过滤子句的输出仅告诉我们主文档是否匹配以及匹配程度如何。它甚至没有告诉我们哪个嵌套文档匹配。为了解决这个问题,我们必须在应用程序中编写代码来根据我们的搜索条件检查每个嵌套文档。
有几个要求添加这些功能,但这并不是一个容易解决的问题。
实现您想要的唯一方法是将子文档索引为单独的文档,并独立地查询和排序它们。在主文档和这些单独的子文档之间建立父子关系可能很有用。 (看父类型映射 http://www.elasticsearch.org/guide/reference/mapping/parent-field.html,家长与孩子部分索引 API 文档 http://www.elasticsearch.org/guide/reference/api/index_.html,以及顶尖儿童 http://www.elasticsearch.org/guide/reference/query-dsl/top-children-query.html and 有孩子 http://www.elasticsearch.org/guide/reference/query-dsl/has-child-query.html查询。
此外,一位 ES 用户还通过邮件发送了有关新产品的列表has_parent filter https://github.com/elasticsearch/elasticsearch/issues/792他们目前正在研究fork https://github.com/hlian/elasticsearch/branches/has_parent。然而,这在主要的 ES 存储库中尚不可用。