2016-12-07 65 views
0

我按offerId分組,每個桶有兩個桶:price <=0price > 0。我需要確保price <= 0包括文檔,其中price場丟失:如何在範圍聚合中設置缺失字段的值?

{ 
    "size": 0, 
    "aggs": { 
     "by_offer_id": { 
     "terms": { 
      "field": "offerId" 
     }, 
     "aggs": { 
      "by_price": { 
       "range": { 
        "field": "price", 
        "ranges": [ 
        { 
         "to": 0 
        }, 
        { 
         "from": 0 
        } 
        ] 
       }, 
       "aggs": { 
        "price_stats": { 
        "stats": { 
         "field": "price" 
        } 
        } 
       } 
      } 
     } 
     } 
    } 
} 

我已經試過"field": "price",後加入"missing": 0,但它拋出SearchPhaseExecutionException

我使用的是1.7.5,但可能會使用2.4.x的語法。

+1

你需要在'stats'集合中放置''missing':0'而不是'range'。但ES1.7中缺少'missing',至少需要ES 2.0。 – Val

+0

@Val看起來不支持1.7,但我肯定會嘗試2.4 – gskema

+0

也許可以使用子聚合:https://www.elastic.co/guide/en/elasticsearch/reference/1.7/ search-aggregations-bucket-missing-aggregation.html? – gskema

回答

0

在這種特殊情況下,我不活動需要設置"missing" : 0

{ 
    "size": 0, 
    "aggs": { 
     "by_offer_id": { 
     "terms": { 
      "field": "offerId" 
     }, 
     "aggs": { 
      "price_stats": { 
       "stats": { 
        "field": "price" 
       } 
      } 
     } 
     } 
    } 
} 

因爲長期聚集返回total文件數,白stats聚集僅包括與現有的價格文件,並返回總數。我可以通過減法推斷出有多少文檔沒有價格字段。