Home > Enterprise >  In ElasticSearch break down hits per filter?
In ElasticSearch break down hits per filter?

Time:03-24

Given the following query, how can I get the number of hits independently for each range and term query and what are the performance implications for this? As of yet, I can't find anything in the documentation that indicates how to do this. Where can I find the docs for such a feature?

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

CodePudding user response:

You can use filter aggregation for getting document count per query clause. As you are providing query as well, you need to use global aggregation with filter aggregation. If you dont use global aggregation then it will return count based on top level query and you will not able to get total document for specific query clause.

Below is sample query with aggregation:

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

You will get below response:

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