假设我有以下映射:
"site": {
"properties": {
"title": { "type": "string" },
"description": { "type": "string" },
"category": { "type": "string" },
"tags": { "type": "array" },
"point": { "type": "geo_point" }
"localities": {
type: 'nested',
properties: {
"title": { "type": "string" },
"description": { "type": "string" },
"point": { "type": "geo_point" }
}
}
}
}
然后我在父文档上执行“_geo_distance”排序,并且能够对“site.point”上的文档进行排序。但是,我还希望嵌套的地方在父文档中按“_geo_distance”排序。
这可能吗?如果是这样,怎么样?
答案 0 :(得分:9)
不幸的是,没有(至少还没有)。
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
,则其内容将在内部创建为单独的(不可见)子文档。这意味着我们可以使用nested query或nested filter将这些嵌套文档作为单独的文档进行查询。
但是,嵌套查询/过滤器子句的输出仅告诉我们主文档是否匹配,以及它匹配的程度。它甚至没有告诉我们哪些嵌套文档匹配。为了解决这个问题,我们必须在我们的应用程序中编写代码,以根据我们的搜索条件检查每个嵌套文档。
有一些open issues要求添加这些功能,但这不是一个容易解决的问题。
实现目标的唯一方法是将子文档索引为单独的文档,并独立查询和排序。在主文档和这些单独的子文档之间建立父子关系可能很有用。 (请参阅parent-type mapping,index api docs的“Parent& Child”部分以及top-children和has-child个查询。
此外,ES用户已在has_parent
filter中邮寄了有关他们当前正在处理的新fork的列表。但是,主要的ES仓库尚未提供此功能。