是否可以在ElasticSearch中对嵌套文档进行排序?

时间:2012-03-02 14:35:16

标签: elasticsearch

假设我有以下映射:

"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”排序。

这可能吗?如果是这样,怎么样?

1 个答案:

答案 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 querynested filter将这些嵌套文档作为单独的文档进行查询。

但是,嵌套查询/过滤器子句的输出仅告诉我们主文档是否匹配,以及它匹配的程度。它甚至没有告诉我们哪些嵌套文档匹配。为了解决这个问题,我们必须在我们的应用程序中编写代码,以根据我们的搜索条件检查每个嵌套文档。

有一些open issues要求添加这些功能,但这不是一个容易解决的问题。

实现目标的唯一方法是将子文档索引为单独的文档,并独立查询和排序。在主文档和这些单独的子文档之间建立父子关系可能很有用。 (请参阅parent-type mappingindex api docs的“Parent& Child”部分以及top-childrenhas-child个查询。

此外,ES用户已在has_parent filter中邮寄了有关他们当前正在处理的新fork的列表。但是,主要的ES仓库尚未提供此功能。