code: def search(
      self,
      trace_id: str,
      progress_bar: Optional[ProgressBar],
      start_time: float,
      progress_callback: Optional[
          Callable[[SearchProgress], Any]
      ] = None,
      return_scores: bool = False,
      extract_features: bool = False,
      accurate_model: bool = False,
      exclude_features_sources: Optional[List[str]] = None,
      importance_threshold: Optional[float] = None,  # deprecated
      max_features: Optional[int] = None,  # deprecated
      filter_features: Optional[dict] = None,  # deprecated
      runtime_parameters: Optional[RuntimeParameters] = None,
  ) -> SearchTask:
      if self.etalon_def is None:
          self.validate()
      file_metrics = FileMetrics()
  
      runtime_parameters = self._rename_generate_features(
          runtime_parameters
      )
  
      file_metadata = self.__construct_metadata(
          exclude_features_sources
      )
      search_customization = self.__construct_search_customization(
          return_scores=return_scores,
          extract_features=extract_features,
          accurate_model=accurate_model,
          importance_threshold=importance_threshold,
          max_features=max_features,
          filter_features=filter_features,
          runtime_parameters=runtime_parameters,
      )
  
      if self.file_upload_id is not None and get_rest_client(
          self.endpoint, self.api_key
      ).check_uploaded_file_v2(
          trace_id, self.file_upload_id, file_metadata
      ):
          search_task_response = get_rest_client(
              self.endpoint, self.api_key
          ).initial_search_without_upload_v2(
              trace_id,
              self.file_upload_id,
              file_metadata,
              file_metrics,
              search_customization,
          )
      else:
          with tempfile.TemporaryDirectory() as tmp_dir:
              parquet_file_path = self.prepare_uploading_file(tmp_dir)
              time.sleep(
                  1
              )  # this is neccesary to avoid requests rate limit restrictions
              time_left = time.time() - start_time
              search_progress = SearchProgress(
                  2.0, ProgressStage.CREATING_FIT, time_left
              )
              if progress_bar is not None:
                  progress_bar.progress = (
                      search_progress.to_progress_bar()
                  )
              if progress_callback is not None:
                  progress_callback(search_progress)
              search_task_response = get_rest_client(
                  self.endpoint, self.api_key
              ).initial_search_v2(
                  trace_id,
                  parquet_file_path,
                  file_metadata,
                  file_metrics,
                  search_customization,
              )
              # if progress_bar is not None:
              #     progress_bar.progress = (6.0, bundle.get(ProgressStage.MATCHING.value))
              # if progress_callback is not None:
              #     progress_callback(SearchProgress(6.0, ProgressStage.MATCHING))
              self.file_upload_id = search_task_response.file_upload_id
  
      return SearchTask(
          search_task_response.search_task_id,
          self,
          return_scores,
          extract_features,
          accurate_model,
          task_type=self.task_type,
          endpoint=self.endpoint,
          api_key=self.api_key,
          client_ip=self.client_ip,
      )
  
imports: import csv
  import hashlib
  import logging
  import tempfile
  import time
  from ipaddress import IPv4Address, IPv6Address, _BaseAddress, ip_address
  from pathlib import Path
  from typing import Any, Callable, Dict, List, Optional, Tuple, Union
  import numpy
  import pandas
  from pandas.api.types import is_bool_dtype
  from pandas.api.types import is_datetime64_any_dtype
  from pandas.api.types import is_float_dtype, is_integer_dtype, is_numeric_dtype, is_string_dtype
  from pandas.core.dtypes.common import is_period_dtype
  from upgini.errors import ValidationError
  from upgini.http import ProgressStage, SearchProgress, get_rest_client
  from upgini.metadata import EVAL_SET_INDEX, SYSTEM_COLUMNS, SYSTEM_RECORD_ID, TARGET, DataType, FeaturesFilter, FileColumnMeaningType, FileColumnMetadata, FileMetadata, FileMetrics, ModelTaskType, NumericInterval, RuntimeParameters, SearchCustomization
  from upgini.normalizer.phone_normalizer import PhoneNormalizer
  from upgini.resource_bundle import bundle
  from upgini.sampler.random_under_sampler import RandomUnderSampler
  from upgini.search_task import SearchTask
  from upgini.utils import combine_search_keys
  from upgini.utils.email_utils import EmailSearchKeyConverter
  from upgini.utils.warning_counter import WarningCounter
label_desc: Use image node_id 43 for calling the Dataset obj's underlying member method code with example usage: obj.search(trace_id, progress_bar, start_time, progress_callback, return_scores, extract_features, accurate_model, exclude_features_sources, importance_threshold, max_features, filter_features, runtime_parameters) and returns: SearchTask