从elasticsearch聚合返回复杂的嵌套文档

问题描述 投票:0回答:1

我有一个看起来像这样的文档:

{
...other stuff
"tags": [
          {
            "name": "Asian",
            "key": "cuisine-asian"
          },
          {
            "name": "Gluten Free",
            "key": "cuisine-gluten-free"
          }

我的索引映射如下:

tags: {
  type: 'nested',
  properties: {
    name: {
      type: 'text',
    },
    key: {
      type: 'keyword',
  }
}

key字段保证是唯一的。

我正在尝试以完整形式返回所有“标签”的列表。我当前的查询可以返回带有键字段的存储桶列表,但是我不知道如何返回整个“标签”对象。

查询:

{
  ...
  body: {
    size: 0,
    aggs: {
      tags: {
        nested: {
          path: 'tags'
        },
        aggs: {
          tag_list: {
            terms: {
              size: 999,
              field: 'tags.key',
            }
          }
        }
      }
    }
  }
}

哪个生成响应:

   "aggregations": {
      "tags": {
        "doc_count": 1708,
        "tag_list": {
          "doc_count_error_upper_bound": 0,
          "sum_other_doc_count": 0,
          "buckets": [
            {
              "key": "cuisine-asian",
              "doc_count": 247
            },
            {
              "key": "cuisine-drinks",
              "doc_count": 112
            },

我希望得到看起来更像以下内容的东西:

"buckets": [
            {
              "key": "cuisine-asian",
              "name": "Asian",
              "doc_count": 247
            },
            {
              "key": "cuisine-drinks",
              "name": "Drinks",
              "doc_count": 112
            },

[如果有关系/有帮助,doc_count字段无关紧要-我只关心形式的基数列表

            {
              "key": "cuisine-drinks",
              "name": "Drinks",
            },

干杯!

typescript elasticsearch search aggregation elasticsearch-dsl
1个回答
0
投票

您可以使用composite aggregation在tag_key和tag_name的合并值上创建存储桶。

在复合聚合中,after_key用于分页

查询:

{
  "size": 0,
  "aggs": {
    "tag": {
      "nested": {
        "path": "tags"
      },
      "aggs": {
        "tag_list": {
          "composite": {
            "sources": [
              {
                "tags_key": {
                  "terms": {
                    "field": "tags.key"
                  }
                }
              },
              {
                "tags_name": {
                  "terms": {
                    "field": "tags.name.keyword"
                  }
                }
              }
            ]
          }
        }
      }
    }
  }
}

结果:

"aggregations" : {
    "tag" : {
      "doc_count" : 2,
      "tag_list" : {
        "after_key" : {
          "tags_key" : "cuisine-gluten-free",
          "tags_name" : "Gluten Free"
        },
        "buckets" : [
          {
            "key" : {
              "tags_key" : "cuisine-asian",
              "tags_name" : "Asian"
            },
            "doc_count" : 1
          },
          {
            "key" : {
              "tags_key" : "cuisine-gluten-free",
              "tags_name" : "Gluten Free"
            },
            "doc_count" : 1
          }
        ]
      }
    }
  }

或者您也可以使用top_hits聚合来获取密钥下的完整文档。查询:

{
  "size": 0,
  "aggs": {
    "tags": {
      "nested": {
        "path": "tags"
      },
      "aggs": {
        "tag_list": {
          "terms": {
            "size": 999,
            "field": "tags.key"
          },
          "aggs": {
            "docs": {
              "top_hits": {
                "size": 10
              }
            }
          }
        }
      }
    }
  }
}

结果:

"aggregations" : {
    "tags" : {
      "doc_count" : 2,
      "tag_list" : {
        "doc_count_error_upper_bound" : 0,
        "sum_other_doc_count" : 0,
        "buckets" : [
          {
            "key" : "cuisine-asian",
            "doc_count" : 1,
            "docs" : {
              "hits" : {
                "total" : {
                  "value" : 1,
                  "relation" : "eq"
                },
                "max_score" : 1.0,
                "hits" : [
                  {
                    "_index" : "index26",
                    "_type" : "_doc",
                    "_id" : "yMDvAXIB90IHVdbFflZp",
                    "_nested" : {
                      "field" : "tags",
                      "offset" : 0
                    },
                    "_score" : 1.0,
                    "_source" : {
                      "name" : "Asian",
                      "key" : "cuisine-asian"
                    }
                  }
                ]
              }
            }
          },
          {
            "key" : "cuisine-gluten-free",
            "doc_count" : 1,
            "docs" : {
              "hits" : {
                "total" : {
                  "value" : 1,
                  "relation" : "eq"
                },
                "max_score" : 1.0,
                "hits" : [
                  {
                    "_index" : "index26",
                    "_type" : "_doc",
                    "_id" : "yMDvAXIB90IHVdbFflZp",
                    "_nested" : {
                      "field" : "tags",
                      "offset" : 1
                    },
                    "_score" : 1.0,
                    "_source" : {
                      "name" : "Gluten Free",
                      "key" : "cuisine-gluten-free"
                    }
                  }
                ]
              }
            }
          }
        ]
      }
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.