Search code examples
elasticsearchelasticsearch-querybooleanquery

What is difference between match and bool must match query in Elasticsearch


What is the difference between Only match and bool must match query in ES?

First, Only use the match query

{
   "query":{
      "match":{
         "address":"mill"
      }
   }
}

enter image description here

Second, use compound query

{
  "query": {
    "bool": {
      "must": [
        { "match": { "address": "mill" } }
      ]
     }
   }
}

enter image description here

Can you tell me everything? What is difference between them?


Solution

  • When you use only one match inside a bool must clause then there is no difference, the bool clause is useful when you want to combine multiple(boolean) criteria, more info on official ES doc. It supports below criteria.

    1. must
    2. must_not
    3. filter
    4. should

    Let me show by taking a small example from your question.

    Index mapping with just address and first_name

    {
        "mappings": {
            "properties": {
                "address": {
                    "type": "text"
                },
                "first_name" :{
                    "type" : "text"
                }
            }
        }
    }
    

    Index 3 docs, all having same address mill, but different first_name

    {
       "address" : "mill",
       "first_name" : "Johnson"
    }
    
    {
       "address" : "mill",
       "first_name" : "Parker"
    }
    
    {
       "address" : "mill",
       "first_name" : "opster"
    }
    

    Search query to show all adresses of mill but must_not contain first_name as parker

    {
        "query": {
            "bool": {
                "must": [
                    {
                        "match": {
                            "address": "mill"
                        }
                    },
                    {
                        "must_not": {
                            "first_name": "parker"
                        }
                    }
                ]
            }
        }
    }
    

    Result only 2 address

    "hits": [
             {
                "_index": "so-60620921-bool",
                "_type": "_doc",
                "_id": "2",
                "_score": 0.13353139,
                "_source": {
                   "address": "mill",
                   "first_name": "opster"
                }
             },
             {
                "_index": "so-60620921-bool",
                "_type": "_doc",
                "_id": "3",
                "_score": 0.13353139,
                "_source": {
                   "address": "mill",
                   "first_name": "Johnson"
                }
             }
          ]
    

    Based on the OP comments, providing the query and filter context, to understand the performance aspects in details.