我将此映射映射到使用嵌套对象的ES数据库中。

每个文档都是一个公司,并具有保存为嵌套对象的员工列表。
这是映射:

 "company": {
    "properties": {
        "company_name": {
           "type": "string"
        },

       "employee": {
          "properties": {
              "name": {
                 "type": "string"
               },
              "city": {
                 "type": "string"
              }
          },
          "type": "nested"
        }
      }
    }
  }
}

我有两家公司:
Company A
    [
    Smith, Dallas
    Mark, New York
    Smith, Houston
    ]

Company B
    [
    Smith, Dallas
    Peter, New York
    Mary, Houston
    ]

即,在不同的公司中可以找到相同的名称,而在每个公司中可以找到多个相同的名称。

我需要运行的查询应该是这样的:

在城市中汇总所有名为Smith的员工

我需要一个这样的答案:
City for employee Smith:
   Dallas:  2
   Houston: 1

请记住,员工是嵌套对象的列表,并且我不需要有关公司名称的任何信息。

最佳答案

试试这个

{
   "size": 0,
   "aggs": {
      "my_aggs": {
         "nested": {
            "path": "employee"
         },
         "aggs": {
            "city_for_smith": {
               "filter": {
                  "term": {
                     "name": "smith"
                  }
               },
               "aggs": {
                  "result": {
                     "terms": {
                         "field": "city"
                     }
                  }
               }
            }
         }
      }
   }
}

要同时显示每个城市的公司名称,您可以在上一个城市中嵌套另一个聚合。

{
  ...
  "aggs": {
    "result": {
      "terms": {
        "field": "city"
      },
      "aggs": {
        "companyAggs": {
          "reverse_nested": {},
          "aggs": {
            "in_company": {
              "terms": {
                "field": "company_name"
              }
            }
          }
        }
      }
    }
  }
}

关于elasticsearch - 嵌套对象和聚合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32474660/

10-15 22:18