一尘不染

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

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

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


阅读 429

收藏
2020-06-22

共1个答案

一尘不染

不幸的是,没有(至少现在还没有)。

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则其内容将在内部创建为单独的(不可见的)子文档。这意味着我们可以使用嵌套查询嵌套过滤器将这些嵌套文档作为单独的文档进行查询。

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

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

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

此外,ES用户已将有关他们当前正在fork中使用的新has_parent过滤器的邮件通过邮件列表发送。但是,这在主要的ES库中尚不可用。

2020-06-22