nodes: 0, module; 1, function_definition; 2, function_name:search; 3, parameters; 4, block; 5, identifier:self; 6, identifier:query_string; 7, expression_statement; 8, expression_statement; 9, comment:# TODO: should QueryParser be a method of query? should it return one?; 10, expression_statement; 11, expression_statement; 12, return_statement; 13, comment:"""Performs a search against the index using lunr query syntax.
  
          Results will be returned sorted by their score, the most relevant
          results will be returned first.
  
          For more programmatic querying use `lunr.Index.query`.
  
          Args:
              query_string (str): A string to parse into a Query.
  
          Returns:
              dict: Results of executing the query.
          """; 14, assignment; 15, assignment; 16, call; 17, call; 18, identifier:query; 19, call; 20, identifier:parser; 21, call; 22, attribute; 23, argument_list; 24, attribute; 25, argument_list; 26, attribute; 27, argument_list; 28, identifier:QueryParser; 29, argument_list; 30, identifier:parser; 31, identifier:parse; 32, identifier:self; 33, identifier:query; 34, identifier:query; 35, identifier:self; 36, identifier:create_query; 37, identifier:query_string; 38, identifier:query
code: def search(self, query_string):
          """Performs a search against the index using lunr query syntax.
  
          Results will be returned sorted by their score, the most relevant
          results will be returned first.
  
          For more programmatic querying use `lunr.Index.query`.
  
          Args:
              query_string (str): A string to parse into a Query.
  
          Returns:
              dict: Results of executing the query.
          """
          query = self.create_query()
          # TODO: should QueryParser be a method of query? should it return one?
          parser = QueryParser(query_string, query)
          parser.parse()
          return self.query(query)