我可以为每个域名列表计算一次吗?

时间:2016-07-15 02:29:37

标签: elasticsearch elasticsearch-2.0

我正在尝试进行术语过滤查询,以获取域名列表中每个域的文档数量:

GET /myindex/_count
{
   "query": {
      "filtered": {
         "filter": {
            "terms": {
                 "domain": ["w3.org"]
            }
         }
      }
   }
}

返回25.我有一个包含几千个域的列表,并且希望在1个查询中执行此操作。那可能吗?我试过了:

GET /myindex/_count
{
  "query": {
    "bool": {
      "must": {
        "terms": {
          "domain": [
            "w3.org",
            "google.com",
            ...,
          ]
        }
      }
    }
  }
}

但这给了我一个数字(而我需要按每个域分解),例如:

w3.org: 25,
google.com: 143,
...

1 个答案:

答案 0 :(得分:1)

query不会为找到的每个匹配字词返回计数,它会显示找到了多少匹配的文档,基本上是在弹性搜索术语中命中的。要获得您发现的每个字词的数字,必须使用aggregations,可以获得更多可用数据here

对于您的特定情况,您必须使用Terms Aggregation,提供更多可用数据here

您的查询将如下所示

GET /myindex/_search
{
  "query": {
    "bool": {
      "must": {
        "terms": {
          "domain": [
            "w3.org",
            "google.com"
          ]
        }
      }
    }
  },
  "aggregations":{
    "domain_count":{
      "terms":{
        "field": "domain"
      }
    }
  }
}

响应看起来像这样,doc_count中的keybuckets是您所需的结果。

{
    ...

    "aggregations" : {
        "domain_count" : {
            "doc_count_error_upper_bound" : 46,
            "buckets" : [
                {
                    "key" : "w3.org",
                    "doc_count" : 100
                },
                {
                    "key" : "google.com",
                    "doc_count" : 52
                },
                ...
            ]
        }
    }
}

确保您使用的是_search终结点,而不是_count

如果您不想限制w3.orggoogle.com等特定域的查询,可以提供match_all查询。它会为您提供domain所有可能的doc_count值。

GET /myindex/_search
{
  "query": {
    "bool": {
      "must": {
        "match_all": {
        }
      }
    }
  },
  "aggregations":{
    "domain_count":{
      "terms":{
        "field": "domain"
      }
    }
  }
}