code: def source(self, fields=None, **kwargs):
          
          s = self._clone()
  
          if fields and kwargs:
              raise ValueError("You cannot specify fields and kwargs at the same time.")
  
          if fields is not None:
              s._source = fields
              return s
  
          if kwargs and not isinstance(s._source, dict):
              s._source = {}
  
          for key, value in kwargs.items():
              if value is None:
                  try:
                      del s._source[key]
                  except KeyError:
                      pass
              else:
                  s._source[key] = value
  
          return s
docs: Selectively control how the _source field is returned.
  
          :arg fields: wildcard string, array of wildcards, or dictionary of includes and excludes
  
          If ``fields`` is None, the entire document will be returned for
          each hit.  If fields is a dictionary with keys of 'include' and/or
          'exclude' the fields will be either included or excluded appropriately.
  
          Calling this multiple times with the same named parameter will override the
          previous values with the new ones.
  
          Example::
  
              s = Search()
              s = s.source(include=['obj1.*'], exclude=["*.description"])
  
              s = Search()
              s = s.source(include=['obj1.*']).source(exclude=["*.description"])