code: def search(self, fields=None, query=None, filters=None):
          
          results = self.search_json(fields, query)['results']
          results = self.search_normalize(results)
          entities = []
          for result in results:
              content_view_components = result.get('content_view_component')
              if content_view_components is not None:
                  del result['content_view_component']
              entity = type(self)(self._server_config, **result)
              if content_view_components:
                  entity.content_view_component = [
                      ContentViewComponent(
                          self._server_config,
                          composite_content_view=result['id'],
                          id=cvc_id,
                      )
                      for cvc_id in content_view_components
                  ]
              entities.append(entity)
          if filters is not None:
              entities = self.search_filter(entities, filters)
          return entities
docs: Search for entities.
  
          :param fields: A set naming which fields should be used when generating
              a search query. If ``None``, all values on the entity are used. If
              an empty set, no values are used.
          :param query: A dict containing a raw search query. This is melded in
              to the generated search query like so:  ``{generated:
              query}.update({manual: query})``.
          :param filters: A dict. Used to filter search results locally.
          :return: A list of entities, all of type ``type(self)``.