class_docstr: Interact with Elasticsearch through the elasticsearch-dbapi.
  
  This hook uses the Elasticsearch conn_id.
  
  :param elasticsearch_conn_id: The :ref:`ElasticSearch connection id <howto/connection:elasticsearch>`
      used for Elasticsearch credentials.
class_docstr_tok: ["Interact","with","Elasticsearch","through","the","elasticsearch-dbapi",".","This","hook","uses","the","Elasticsearch","conn_id",".",":","param","elasticsearch_conn_id",":","The",":","ref",":","`","ElasticSearch","connection","id","<","howto\/connection",":","elasticsearch",">","`","used","for","Elasticsearch","credentials","."]
code: def get_uri(self) -> str:
      conn_id = getattr(self, self.conn_name_attr)
      conn = self.connection or self.get_connection(conn_id)
  
      login = ""
      if conn.login:
          login = f"{conn.login}:{conn.password}@"
      host = conn.host
      if conn.port is not None:
          host += f":{conn.port}"
      uri = f"{conn.conn_type}+{conn.schema}://{login}{host}/"
  
      extras_length = len(conn.extra_dejson)
      if not extras_length:
          return uri
  
      uri += "?"
  
      for arg_key, arg_value in conn.extra_dejson.items():
          extras_length -= 1
          uri += f"{arg_key}={arg_value}"
  
          if extras_length:
              uri += "&"
  
      return uri
  
imports: from __future__ import annotations
  import warnings
  from functools import cached_property
  from typing import TYPE_CHECKING, Any
  from urllib import parse
  from elasticsearch import Elasticsearch
  from airflow.exceptions import AirflowProviderDeprecationWarning
  from airflow.hooks.base import BaseHook
  from airflow.providers.common.sql.hooks.sql import DbApiHook
label_desc: Use image node_id 3 for calling the ElasticsearchSQLHook obj's underlying member method code with example usage: obj.get_uri() and returns: uri, uri