2014-10-31 115 views
3

我對ElasticSearch聚合頗爲陌生。我希望能夠統計有多少個文檔被非空字段檢索。Elasticsearch:聚合「現有」字段

下面是我要計算有多少文檔沒有name字段。

{ 
    "size": 3, 
    "query": { 
    "query_string": { 
     "query": "martin" 
    } 
    }, 
    "aggs": { 
    "results_without_mb_id": { 
     "missing": { 
     "field": "name" 
     } 
    } 
    } 
} 

它的作品,但我想做的完全相反。是否有existing聚合?

回答

0

您想使用「存在」過濾器。

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-exists-filter.html

這裏是查找所有地方authResult.codeID存在的文件的樣本,然後運行在其上的聚集:

GET prodstarbucks/authEvent/_search 
{ 
    "size": 0, 
    "query": { 
    "filtered": { 
     "query": { 
     "match_all": {} 
     }, 
     "filter": { 
     "exists": { 
      "field": "authResult.codeID" 
     } 
     } 
    } 
    }, 
    "aggs": { 
    "users": { 
     "terms": { 
     "field": "authInput.userName.userNameNotAnalyzed", 
     "size": 5 
     } 
    } 
    } 
} 

}

注意:如果只有你要計算您甚至不需要聚合的文檔,只需使用返回的「總數」匹配。

+0

其實我不想改變我的查詢。我只想計算具有非空名稱(和「年齡」,...)的文檔數量。 – litil 2014-10-31 16:13:59

+0

「存在」(又名不爲空)僅作爲過濾器選項有效,因此無法將其放入查詢節點中。您可以像我在上面的示例中那樣將過濾器和查詢組合在一起。所以你應該在存在過濾器中使用「Name」,並在查詢部分使用query_string。 – jhilden 2014-10-31 17:19:47

4

和上面一樣,只是取代「失蹤」與「存在」,也可以增加「過濾器」鍵,所以:

{ "size": 3, 
    "query": { 
    "query_string": { 
     "query" : "martin" 
    } 
    }, 
    "aggs": { 
    "results_without_mb_id": { 
     "filter": { 
      "exists": { 
      "field": "name" 
      } 
     } 
    } 
}