在 ElasticSearch 中分解每个过滤器的命中?

In ElasticSearch break down hits per filter?

给定以下查询,我如何才能独立获得每个范围和术语查询的命中数,这对性能有何影响?到目前为止,我在文档中找不到任何指示如何执行此操作的内容。在哪里可以找到此类功能的文档?

{
      "query": {
        "bool" : {
          "must" : {
            "term" : { "user.id" : "kimchy" }
          },
          "filter": {
            "term" : { "tags" : "production" }
          },
          "must_not" : {
            "range" : {
              "age" : { "gte" : 10, "lte" : 20 }
            }
          },

您可以将 filter aggregation for getting document count per query clause. As you are providing query as well, you need to use global aggregation 与过滤器聚合一起使用。如果您不使用全局聚合,那么它将 return 根据顶级查询进行计数,您将无法获得特定查询子句的总文档。

下面是聚合查询示例:

{
  "query": {
    "bool": {
      "must": {
        "term": {
          "user.id": "kimchy"
        }
      },
      "filter": {
        "term": {
          "tags": "production"
        }
      },
      "must_not": {
        "range": {
          "age": {
            "gte": 10,
            "lte": 20
          }
        }
      }
    }
  },
  "aggs": {
    "Total": {
      "global": {},
      "aggs": {
        "user_term": {
          "filter": {
            "term": {
              "user.id": "kimchy"
            }
          }
        },
        "tag_term": {
          "filter": {
            "term": {
              "tags": "production"
            }
          }
        },
        "age_range_not": {
          "filter": {
            "bool": {
              "must_not": {
                "range": {
                  "age": {
                    "gte": 10,
                    "lte": 20
                  }
                }
              }
            }
          }
        },
        "age_range": {
          "filter": {
            "range": {
              "age": {
                "gte": 10,
                "lte": 20
              }
            }
          }
        }
      }
    }
  }
}

您将得到以下回复:

"aggregations" : {
    "Total" : {
      "doc_count" : 3,
      "age_range" : {
        "doc_count" : 2
      },
      "age_range_not" : {
        "doc_count" : 1
      },
      "tag_term" : {
        "doc_count" : 3
      },
      "user_term" : {
        "doc_count" : 2
      }
    }
  }