code: def build_elastic_query(doc):
      
      elastic_query, filters = {"query": {"filtered": {}}}, []
  
      for key in doc.keys():
          if key == 'q':
              elastic_query['query']['filtered']['query'] = _build_query_string(doc['q'])
          else:
              _value = doc[key]
              filters.append({"terms": {key: _value}} if isinstance(_value, list) else {"term": {key: _value}})
  
      set_filters(elastic_query, filters)
      return elastic_query
docs: Build a query which follows ElasticSearch syntax from doc.
  
      1. Converts {"q":"cricket"} to the below elastic query::
  
          {
              "query": {
                  "filtered": {
                      "query": {
                          "query_string": {
                              "query": "cricket",
                              "lenient": false,
                              "default_operator": "AND"
                          }
                      }
                  }
              }
          }
  
      2. Converts a faceted query::
  
          {"q":"cricket", "type":['text'], "source": "AAP"}
  
      to the below elastic query::
  
          {
              "query": {
                  "filtered": {
                      "filter": {
                          "and": [
                              {"terms": {"type": ["text"]}},
                              {"term": {"source": "AAP"}}
                          ]
                      },
                      "query": {
                          "query_string": {
                              "query": "cricket",
                              "lenient": false,
                              "default_operator": "AND"
                          }
                      }
                  }
              }
          }
  
      :param doc: A document object which is inline with the syntax specified in the examples.
                  It's the developer responsibility to pass right object.
      :returns ElasticSearch query