首页 > 解决方案 > ES查询按parent_id分组

问题描述

我的弹性搜索中有以下数据。我想用组查询这些数据。

{
   "id" : "001",
   "parent_id" : "001",
   "name" : "test001"
},
{
   "id" : "002",
   "parent_id" : "001",
   "name" : "test002"
},
{
   "id" : "003",
   "parent_id" : "001",
   "name" : "test003"
}
{
   "id" : "004",
   "parent_id" : "004",
   "name" : "test004"
}

这是我预期的格式:

{
   "id" : "001",
   "parent_id" : "001",
   "name" : "test001"
   "children": [
   {
     "id" : "002",
     "parent_id" : "001",
     "name" : "test002"
   },
   {
     "id" : "003",
     "parent_id" : "001",
     "name" : "test003"
   }
  ]
},
{
   "id" : "004",
   "parent_id" : "004",
   "name" : "test004"
}

有什么方法可以使用弹性搜索查询来实现这一点?

标签: elasticsearch

解决方案


假设它parent_idkeyword字段类型,和/或具有类似于以下的多字段映射:

"parent_id" : {
  "type" : "text",
  "fields" : {
    "keyword" : {          <---
      "type" : "keyword"    
    }
  }
}

您可以首先对所有文档进行分组parent_id.keyword,然后#001使用top_hits聚合列出所有子项(包括) :

POST my-index/_search?filter_path=aggregations.*.buckets.key,aggregations.*.buckets.children.hits.hits._source
{
  "size": 0,
  "aggs": {
    "by_parent_id": {
      "terms": {
        "field": "parent_id.keyword",
        "size": 10
      },
      "aggs": {
        "children": {
          "top_hits": {
            "sort": [
              {
                "id.keyword": {
                  "order": "asc"
                }
              }
            ],
            "size": 10
          }
        }
      }
    }
  }
}

屈服

{
  "aggregations" : {
    "by_parent_id" : {
      "buckets" : [
        {
          "key" : "001",
          "children" : {
            "hits" : {
              "hits" : [
                {
                  "_source" : {
                    "id" : "001",
                    "parent_id" : "001",
                    "name" : "test001"
                  }
                },
                {
                  "_source" : {
                    "id" : "002",
                    "parent_id" : "001",
                    "name" : "test002"
                  }
                },
                {
                  "_source" : {
                    "id" : "003",
                    "parent_id" : "001",
                    "name" : "test003"
                  }
                }
              ]
            }
          }
        },
        {
          "key" : "004",
          "children" : {
            "hits" : {
              "hits" : [
                {
                  "_source" : {
                    "id" : "004",
                    "parent_id" : "004",
                    "name" : "test004"
                  }
                }
              ]
            }
          }
        }
      ]
    }
  }
}

您还可以按您选择的指标对子项进行排序——也许是id.keyword

POST my-index/_search?filter_path=aggregations.*.buckets.key,aggregations.*.buckets.children.hits.hits._source
{
  "size": 0,
  "aggs": {
    "by_parent_id": {
      "terms": {
        "field": "parent_id.keyword",
        "size": 10
      },
      "aggs": {
        "children": {
          "top_hits": {
            "sort": [             <---
              {
                "id.keyword": {
                  "order": "asc"
                }
              }
            ],
            "size": 10
          }
        }
      }
    }
  }
}

最后,您也可以控制顶级术语聚合的顺序。


推荐阅读