2017-07-03 135 views
2

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

有客户指标,与具有以下结构的服务嵌套的字段类型的客户:

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

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

如何指望它发生在六月2017年得到了一个等级的所有服务高于5?

回答

1

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

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