[英]get a specific value based on criteria from elasticsearch array using java
我的彈性搜尋資料看起來像
{
"took": 12,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 1,
"hits": [
{
"_index": "eswar",
"_type": "azure",
"_id": "AV6y005oafdLlkt7Fe-R",
"_score": 1,
"_source": {
"costs": [
{
"cost": 3.6,
"endDate": "2017-02-15T00:00:00+00:00",
"startDate": "2017-02-14T00:00:00+00:00"
},
{
"cost": 2,
"endDate": "2017-02-14T00:00:00+00:00",
"startDate": "2017-02-13T00:00:00+00:00"
}
],
"externalUUID": "/subscriptions/9ee6993f-a036-4118-9eab-c66d9fda1ef3/resourceGroups/VISTARAGATEWAYIMAGE/providers/Microsoft.Compute/disks/VistaraGateway01_disk1_ec7798e17f934e6483ed5d2490e80d98",
"clientId": 154,
"region": "useast",
"cloudProviderId": 57063
}
},
{
"_index": "eswar",
"_type": "azure",
"_id": "AV6y00rmafdLlkt7Fe-Q",
"_score": 1,
"_source": {
"costs": [
{
"cost": 0,
"endDate": "2017-02-14T00:00:00+00:00",
"startDate": "2017-02-13T00:00:00+00:00"
},
{
"cost": 3,
"endDate": "2017-02-17T00:00:00+00:00",
"startDate": "2017-02-16T00:00:00+00:00"
}
],
"externalUUID": "/subscriptions/9ee6993f-a036-4118-9eab-c66d9fda1ef3/resourceGroups/vistaragatewayimage/providers/Microsoft.Compute/virtualMachines/VistaraGateway",
"clientId": 154,
"region": "eastus",
"cloudProviderId": 57063
}
}
]
}
}
我想獲得costs.cost:3.6作為聚合結果,但是我得到的結果是5,如何即使在數組中也可以過濾數據?
RangeQueryBuilder startDateRQB = QueryBuilders.rangeQuery("costs.startDate").gte("2017-02-14T00:00:00+00:00");
RangeQueryBuilder endDateRQB = QueryBuilders.rangeQuery("costs.endDate").lte("2017-02-15T00:00:00+00:00");
RegexpQueryBuilder deviceNameREQB= QueryBuilders.regexpQuery("region", "useast.*");
BoolQueryBuilder bQB=QueryBuilders.boolQuery().must(deviceNameREQB).must(startDateRQB).must(endDateRQB);
BoolQueryBuilder sQB=QueryBuilders.boolQuery().must(startDateRQB).must(endDateRQB);
SearchResponse response = client.prepareSearch(index).setQuery(bQB).addAggregation(AggregationBuilders.sum("Totalcost").field("costs.cost")).execute().actionGet();
Sum sum=response.getAggregations().get("Totalcost");
double cost=sum.getValue();
System.out.println(cost);
我建議您將costs
定義為嵌套對象。 然后,您將可以在內部數據(嵌套文檔)上添加條件。
這種方法可以為您的查詢提供廣泛的可能性。
看一下以下解決方案:
{
"size": 0,
"aggregations": {
"costs_agg": {
"nested": {
"path": "costs"
},
"aggregations": {
"bool_agg": {
"must": [
{
"range": {
"costs.startDate": {
"gte": "2017-02-14T00:00:00+00:00"
}
}
},
{
"range": {
"costs.endDate": {
"lte": "2017-02-15T00:00:00+00:00"
}
}
},
{
"wildcard": {
"costs.region": "useast.*"
}
}
]
},
"aggregations": {
"cost_sum_agg": {
"sum": {
"field": "costs.cost"
}
}
}
}
}
}
}
讓我解釋一下每個聚合(按其名稱):
希望能幫助到你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.