2014-10-31 112 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" 
      } 
     } 
    } 
}