ElasticSearch计算嵌套字段

时间:2017-07-03 15:48:57

标签: elasticsearch

如何计算在ElasticSearch中满足某个条件的嵌套字段(嵌套对象列表)的对象?

示例

拥有Customer索引,类型为Customer,其服务嵌套字段具有以下结构:

public class Customer
{
    public int Id;
    public List<Service> Services;
}

public class Service
{
    public int Id;
    public DateTime Date;
    public decimal Rating;
}

如何统计2017年6月发生的所有服务并获得高于5的评级?

1 个答案:

答案 0 :(得分:3)

好问题:) 为了得到你想要的东西你应该在前面定义你的映射,嵌套属性映射效果很好。

嵌套类型是对象数据类型的专用版本,它允许对象数组的索引和独立 彼此 https://www.elastic.co/guide/en/elasticsearch/reference/2.4/nested.html

请在下面找到完整示例:)

<强>映射

PUT example_nested_test
{
  "mappings": {
    "nested": {
      "properties": {
        "Id": {
          "type": "long"
        },
        "Services": {
          "type": "nested",
          "properties": {
            "Id": {
              "type": "long"
            },
            "Date": {
              "type": "date"
            },
            "Rating": {
              "type": "long"
            }
          }
        }
      }
    }
  }
}

POST数据

POST example_nested_test/nested/100
    {
      "Id" : 1,
      "Services": [
        {
          "Id": 1,
          "Date" :"2017-05-10",
          "Rating" : 5
        },
         {
          "Id": 2,
          "Date" :"2013-05-10",
          "Rating" : 2
        },
        {
          "Id": 4,
          "Date" :"2017-05-10",
          "Rating" : 6
        }]
    }

查询

GET example_nested_test/_search
{
  "size":0, 
  "aggs": {
    "Services": {
      "nested": {
        "path": "Services"
      },
      "aggs": {
        "Rating": {
          "filter": {
            "bool": {
              "must": [
                {
                  "range": {
                    "Services.Date": {
                      "gt": "2017",
                      "format": "yyyy"
                    }
                  }
                },
                {
                  "range": {
                    "Services.Rating": {
                      "gt": "5"
                    }
                  }
                }
              ]
            }
          }
        }
      }
    }
  }
}

结果

 "aggregations": {
    "Services": {
      "doc_count": 3,
      "Rating": {
        "doc_count": 1
      }
    }
  }