如何计算 ElasticSearch 中满足特定条件的嵌套字段(即嵌套对象列表)的对象?
例子
具有客户索引,类型为客户,其具有以下结构的服务嵌套字段:
public class Customer
{
public int Id;
public List<Service> Services;
}
public class Service
{
public int Id;
public DateTime Date;
public decimal Rating;
}
Run Code Online (Sandbox Code Playgroud)
如何统计 2017 年 6 月发生且评分高于 5 的所有服务?
好问题:)为了得到你想要的,你应该预先定义你的映射,并且嵌套属性映射效果很好。
嵌套类型是对象数据类型的特殊版本,它允许对象数组彼此独立地进行索引和查询。 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"
}
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
发布数据
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
}]
}
Run Code Online (Sandbox Code Playgroud)
询问
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"
}
}
}
]
}
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
结果:
"aggregations": {
"Services": {
"doc_count": 3,
"Rating": {
"doc_count": 1
}
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
10083 次 |
最近记录: |