我可以获得每个域列表的计数吗?

Can I get a count for each of a list of domains?

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

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

Returns 25. 我有一个包含几千个域的列表,我想在 1 个查询中完成所有这些。那可能吗?我试过:

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

但这给了我 1 个数字(而我需要它们按每个域细分),例如:

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

query 不会 return 计算找到的每个匹配项,它会显示找到了多少匹配文档,基本上是 elasticsearch 术语中的命中。要获得您发现的每个术语的数字,您必须使用 aggregations,更多可用数据 here

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

您的查询将如下所示

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

响应看起来像这样,其中 buckets 中的 doc_countkey 是您需要的结果。

{
    ...

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