docstr: Perform search on a query passed in by _get_query_results multiprocessing part.
  
  Args:
      data_tuple: Tuple of (query_key, query_val, search_method_object, thresh)
  
  Returns:
     List of retrieved duplicate files and corresponding hamming distance for the query file.
docstr_tok: ["Perform","search","on","a","query","passed","in","by","_get_query_results","multiprocessing","part",".","Args",":","data_tuple",":","Tuple","of","(","query_key",",","query_val",",","search_method_object",",","thresh",")","Returns",":","List","of","retrieved","duplicate","files","and","corresponding","hamming","distance","for","the","query","file","."]
code: def _searcher(self, data_tuple) -> None:
      """
      Perform search on a query passed in by _get_query_results multiprocessing part.
  
      Args:
          data_tuple: Tuple of (query_key, query_val, search_method_object, thresh)
  
      Returns:
         List of retrieved duplicate files and corresponding hamming distance for the query file.
      """
      query_key, query_val, search_method_object, thresh = data_tuple
      res = search_method_object.search(query=query_val, tol=thresh)
      res = [
          i for i in res if i[0] != query_key
      ]  # to avoid self retrieval
      return res
  
imports: from multiprocessing import cpu_count
  import sys
  from typing import Callable, Dict, Union, Tuple
  import numpy
  from sklearn.metrics.pairwise import cosine_similarity
  from tqdm import tqdm
  from imagededup.handlers.search.bktree import BKTree
  from imagededup.handlers.search.brute_force import BruteForce
  from imagededup.handlers.search.brute_force_cython import BruteForceCython
  from imagededup.utils.general_utils import parallelise
  from imagededup.utils.logger import return_logger
label_desc: Use image node_id 2 for calling the HashEval obj's underlying member method code with example usage: obj._searcher(data_tuple) and returns: res