Elastic Search : Match Query not working in Nested Bool Filters

I am able to get data for the following elastic search query :

{
  "query": {
    "filtered": {
      "query": [],
      "filter": {
        "bool": {
          "must": [
            {
              "bool": {
                "should": [
                  {
                    "term": {
                      "gender": "malE"
                    }
                  },
                  {
                    "term": {
                      "sentiment": "positive"
                    }
                  }
                ]
              }
            }
          ]
        }
      }
    }
  }
}

However, If I query using "match" - I get error message with 400 status response

{
  "query": {
    "filtered": {
      "query": [],
      "filter": {
        "bool": {
          "must": [
            {
              "bool": {
                "should": [
                  {
                    "match": {
                      "gender": "malE"
                    }
                  },
                  {
                    "term": {
                      "sentiment": "positive"
                    }
                  }
                ]
              }
            }
          ]
        }
      }
    }
  }
}

Is match query not supported in nested bool filters ?

Since the term query looks for the exact term in the field’s inverted index and I want to query gender data as case_insensitive field - Which approach shall I try ?

Settings of the index :

{
  "settings": {
    "index": {
      "analysis": {
        "analyzer": {
          "analyzer_keyword": {
            "tokenizer": "keyword",
            "filter": "lowercase"
          }
        }
      }
    }
  }
}

Mapping for field Gender:

{"type":"string","analyzer":"analyzer_keyword"}

Solution 1:

The reason you're getting an error 400 is because there is no match filter, only match queries, even though there are both term queries and term filters.

Your query can be as simple as this, i.e. no need for a filtered query, simply put your term and match queries into a bool/should:

{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "gender": "male"
          }
        },
        {
          "term": {
            "sentiment": "positive"
          }
        }
      ]
    }
  }
}