合并多个聚合

时间:2018-03-09 03:14:28

标签: elasticsearch lucene elasticsearch-aggregation

我是Elasticsearch的绝对新手,并试图了解聚合。我需要运行与现有聚合并行的聚合。 这是示例文档页面结构。

{
  "brand": {
    "list": [
      "Apple"
    ],
    "name": "Apple"
  },
  "title": {
    "list": [
      "Apple Macbook Pro 15 - Intel I7 3,10ghz (2tb|r560|touchid|space) 2017"
    ]
  },
  "category": {
    "l1": {
      "name": "Computers/Tablets & Networking",
      "id": 58058
    },
    "l2": {
      "name": "Laptops & Netbooks",
      "id": 175672
    },
    "l3": {
      "name": "Apple Laptops",
      "id": 111422
    },
    "l4": {},
    "l5": {},
    "l6": {}
  }
}

这是我正在运行的现有查询,用于获取给定标题的前5个类别名称的聚合,这是完美的。

{
    "size": 0,
    "aggs":
    {
        "categoryId":
        {
            "filter":
            {
                "bool":
                {
                    "filter": [
                    {
                        "term":
                        {
                            "title.list": "phone"
                        }
                    }]
                }
            },
            "aggs":
            {
                "results":
                {
                    "terms":
                    {
                        "field": "category.l2.id",
                        "size": 5
                    },
                    "aggs":
                    {
                        "categoryName":
                        {
                            "terms":
                            {
                                "field": "category.l2.name.keyword",
                                "size": 1
                            }
                        }
                    }
                }
            }
        }
    }
}

接下来,我需要找到与标题关键字搜索相关联的前5个品牌名称,如果可能,按降序排序。 所以我试试这个,但它不起作用,也引发了错误。

{
    "size": 0,
    "aggs":
    {
        "categoryId":
        {
            "filter":
            {
                "bool":
                {
                    "filter": [
                    {
                        "term":
                        {
                            "title.list": "phone"
                        }
                    }]
                }
            },
            "aggs":
            {
                "results":
                {
                    "terms":
                    {
                        "field": "category.l2.id",
                        "size": 5
                    },
                    "aggs":
                    {
                        "categoryName":
                        {
                            "terms":
                            {
                                "field": "category.l2.name.keyword",
                                "size": 1
                            }
                        }
                    }
                },
                "brands_names":
                {
                    "terms":
                    {
                        "field": "brand.name",
                        "size": 10
                    },
                    "aggs":
                    {
                        "brand_top_hits":
                        {
                            "top_hits":
                            {
                                "size": 1
                            }
                        }
                    }
                }
            }
        }
    }
}

我知道我错过了一些明显的东西。我应该使用价值计数或热门点击查询来查找前5大品牌吗?如何将其与现有类别查询相结合?

1 个答案:

答案 0 :(得分:0)

我使用此查询

{
  "size": 0,
  "aggs": {
    "categoryId": {
      "filter": {
        "bool": {
          "filter": [
            {
              "term": {
                "title.list": "bag"
              }
            }
          ]
        }
      },
      "aggs": {
        "results": {
          "terms": {
            "field": "category.l2.id",
            "size": 5
          },
          "aggs": {
            "categoryName": {
              "terms": {
                "field": "category.l2.name.keyword",
                "size": 1
              }
            },
            "brands_names": {
              "terms": {
                "field": "brand.name.keyword",
                "size": 10
              }
            }
          }
        }
      }
    }
  }
}