Elasticsearch:聚合“现有”字段

9

我对ElasticSearch聚合还不太熟悉。我想要能够计算检索到的非空字段文档数量。

以下是我使用的方法来计算没有name字段的文档数量。

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

它能工作,但我想做相反的事情。 是否存在现有的聚合方式?

2个回答

16

通过将“exists”过滤器传递给filter aggregation来完成此操作。像上面一样,只需用“exists”替换“missing”,并添加“filter”键,因此:

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

3

您想使用“exists”过滤器。

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
      }
    }
  }
}

}

注意:如果您只想计算文档数量,甚至不需要聚合,只需使用返回的“总”命中数即可。

实际上我不想改变我的查询。我只想计算具有非空“名称”(和“年龄”,等等)的文档数量。 - litil
“存在”(即非空)仅作为筛选选项有效,不能放在查询节点中。您可以像我上面的示例一样将过滤器和查询组合在一起。因此,您会在存在的筛选器中有“名称”,并在查询部分中使用您的查询字符串内容。 - jhilden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接