【问题标题】:Is it possible to sort nested documents in ElasticSearch?是否可以在 ElasticSearch 中对嵌套文档进行排序?
【发布时间】:2012-03-21 01:23:09
【问题描述】:

假设我有以下映射:

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

这可能吗?如果有,怎么做?

【问题讨论】:

    标签: elasticsearch


    【解决方案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 类型,则其内容将在内部创建为单独的(不可见)子文档。这意味着我们可以使用nested querynested filter 将这些嵌套文档作为单独的文档进行查询。

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

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

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

    另外,一位 ES 用户已将列表邮寄到了一个新的has_parent filter,他们目前正在fork 中工作。但是,这在主 ES 存储库中尚不可用。

    【讨论】:

    • 好吧,我玩了一点。正如我所见,实际上没有办法按地区父字段进行搜索?然后,您必须在每个子项中包含需要可搜索的父字段,对吗?
    • 正确。你不能做连接。每个文件都根据其自身的优点进行评估。父/子查询和嵌套查询加倍工作,因为它们首先对(例如)子查询运行,然后使用这些值对父查询运行
    • 好的,所以不能在查询子节点的同时返回父节点?你可以搜索孩子并查询父母的字段吗?
    • 我发布了一个更广泛的 question 解释我想要实现的目标
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多