ElasticSearch 计数嵌套字段

船长

在 ElasticSearch 中,如何计算满足特定条件的嵌套字段(即嵌套对象列表)的对象?

例子

有 Customer 索引,类型 Customer 有一个 Services 嵌套字段,结构如下:

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 的所有服务?

natnael88

好问题 :) 为了得到你想要的东西,你应该预先定义你的映射,并且嵌套的属性映射工作得很好。

嵌套类型是该对象的数据类型,它允许对象的数组要索引和查询的专用版本独立彼此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 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
      }
    }
  }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章