通过 Elasticsearch 中的查询进行文档计数聚合(如 solr 中的 facet.query)

Document count aggregation via query in Elasticsearch (like facet.query in solr)

我有一个主查询,我需要几个子查询的匹配数。 用 solr 的话我需要一个 facet.query. What I am missing is a simple doc_count aggregation like the value_count aggregation.

有什么建议吗?

我发现了两个我不喜欢的可能解决方案:

  1. _id 上使用 filter aggregation with value_count 指标:

示例:

GET _search
{
    "query": {
        "match_main": {}
    },
    "aggs": {
            "facetvalue1": {
                "filter": {
                     "bool": { 
                    "should": [
                      {"match": { "name": "fred" }},
                      {"term": { "lastname": "krueger" }}
                     ]
                     }
                },
                "aggs": {
                    "count": {
                        "value_count": {
                            "field": "_id"
                        }
                    }
                }
            },
            "facetvalue2": {
                "filter": {
                      "term": { "name": "freddy" }
                },
                "aggs": {
                    "count": {
                        "value_count": {
                            "field": "_id"
                        }
                    }
                }
            }
    }
}
  1. 使用Multi Search API

示例:

GET _msearch
{"index":"myindex"}
{"query":{"match_main": {}}}
{"index":"myindex"}
{"size": 0, "query":{"match_main": {}}, "filter": {"bool": {"should":[{"match": { "name": "fred" }},{"term": { "lastname": "krueger" }}]}}}
{"index":"myindex"}
{"size": 0, "query":{"match_main": {}},"filter": {"term": { "name": "freddy" }}}

我看到解决方案 2 更快,但可以想象 match_main 是一个复杂的查询! 所以如果有 doc_count:{} 而不是 value_count:{"field":"_id"}.

我更喜欢解决方案 1

但是回到我的基本问题:elasticsearch 中 solr facet.query 的对应物是什么?

您可以为此使用 filters aggregation。请注意额外的 s,它与您已经提到的 filter 聚合不同。

{
  "query": {
    "match_all": {}
  },
  "size": 0,
  "aggs": {
    "values": {
      "filters": {
        "filters": {
          "value1": {
            "bool": {
              "should": [
                {
                  "match": {
                    "name": "fred"
                  }
                },
                {
                  "term": {
                    "lastname": "krueger"
                  }
                }
              ]
            }
          },
          "value2": {
            "term": {
              "name": "freddy"
            }
          }
        }
      }
    }
  }
}

这将return类似于

"aggregations": {
  "values": {
    "buckets": {
      "value1": {
        "doc_count": 4
      },
      "value2": {
        "doc_count": 1
      }
    }
  }
}

编辑:一般来说,您不必对存储桶聚合使用度量聚合。如果您不提供任何子聚合,您将只获得文档计数。在这种情况下,filters 将提供存储桶,但多个 filter 聚合也应该起作用。