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

Yeg*_*eps 7 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" }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然后,我在父文档上执行"_geo_distance"排序,并能够对"site.point"上的文档进行排序.但是,我还希望嵌套的局部性在父文档中按"_geo_distance"排序.

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

DrT*_*ech 9

不幸的是,没有(至少还没有).

ElasticSearch中的查询只标识哪些文档与查询匹配,以及它们匹配的程度.

要了解嵌套文档的用途,请考虑以下示例:

{
    "title":    "My post",
    "body":     "Text in my body...",
    "followers": [
        {
            "name":     "Joe",
            "status":   "active"
        },
        {
            "name":     "Mary",
            "status":   "pending"
        },
    ]
}        
Run Code Online (Sandbox Code Playgroud)

上述JSON,一旦在ES中编入索引,在功能上等同于以下内容.请注意该followers字段是如何展平的:

{
    "title":            "My post",
    "body":             "Text in my body...",
    "followers.name":   ["Joe","Mary"],
    "followers.status": ["active","pending"]
}        
Run Code Online (Sandbox Code Playgroud)

搜索:followers with status == active and name == Mary将错误地匹配此文档.

嵌套字段允许我们解决此限制.如果该followers字段被声明为类型nested而不是类型,object那么其内容将在内部创建为单独的(不可见的)子文档.这意味着我们可以使用嵌套查询嵌套过滤器将这些嵌套文档作为单独的文档进行查询.

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

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

实现所需目标的唯一方法是将子文档索引为单独的文档,并独立查询和排序.在主文档和这些单独的子文档之间建立父子关系可能很有用.(请参阅父类型映射,索引api文档的父和子部分以及 top-childrenhas-child查询.

此外,ES用户已经邮寄了关于他们当前正在fork中工作的新has_parent过滤器的列表.但是,主要的ES仓库尚未提供此功能.