You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by "armandmasseaugit (via GitHub)" <gi...@apache.org> on 2025/08/08 07:42:18 UTC

[PR] Enhanced Elasticsearch provider with comprehensive ElasticsearchHook [airflow]

armandmasseaugit opened a new pull request, #54259:
URL: https://github.com/apache/airflow/pull/54259

   # Enhanced Elasticsearch provider with comprehensive ElasticsearchHook
   
   ## Summary
   
   This PR introduces a new comprehensive `ElasticsearchHook` that provides enhanced functionality for interacting with Elasticsearch clusters, with better Airflow integration and additional features.
   
   ## What changed
   
   ### New Features
   
   - **Enhanced ElasticsearchHook**: Complete rewrite with comprehensive functionality
   - **Airflow Connection Integration**: Full support for Airflow connections with environment variable fallback
   - **Bulk Operations**: Support for `bulk()`, `streaming_bulk()`, and `parallel_bulk()` operations
   - **Index Management**: Methods for creating, deleting, and checking index existence
   - **Pandas Integration**: `search_to_pandas()` and `scan_to_pandas()` methods with lazy imports
   - **Context Manager Support**: Automatic connection cleanup with `with` statement
   - **Data Migration**: `reindex()` method for moving data between indices
   - **Enhanced Error Handling**: Better connection testing and error reporting
   
   ### Deprecations
   
   - **ElasticsearchPythonHook**: Marked as deprecated in favor of the new `ElasticsearchHook`
   
   ### Configuration Improvements
   
   The new hook supports a three-tier configuration priority:
   1. Airflow connections (primary)
   2. Environment variables (fallback)  
   3. Default values (last resort)
   
   Supported environment variables:
   - `ELASTICSEARCH_HOST`
   - `ELASTICSEARCH_PORT`
   - `ELASTICSEARCH_USERNAME`
   - `ELASTICSEARCH_PASSWORD`
   - `ELASTICSEARCH_USE_SSL`
   - `ELASTICSEARCH_VERIFY_CERTS`
   - `ELASTICSEARCH_TIMEOUT`
   - `ELASTICSEARCH_MAX_RETRIES`
   
   ## API Reference
   
   ### New Methods
   
   ```python
   # Connection and testing
   hook.test_connection() -> bool
   hook.get_conn() -> Elasticsearch
   
   # Search operations  
   hook.search(query, index_name, **kwargs) -> Dict
   hook.scan(index, query, **kwargs) -> Generator
   
   # Pandas integration (lazy imports)
   hook.search_to_pandas(index, query, **kwargs) -> pd.DataFrame
   hook.scan_to_pandas(index, query, **kwargs) -> pd.DataFrame
   
   # Bulk operations
   hook.bulk(actions, **kwargs) -> Tuple[int, List]
   hook.streaming_bulk(actions, **kwargs) -> Generator
   hook.parallel_bulk(actions, **kwargs) -> Generator
   
   # Index management
   hook.create_index(index_name, mappings, settings, **kwargs) -> Dict
   hook.delete_index(index_name, **kwargs) -> Dict
   hook.index_exists(index_name) -> bool
   
   # Data migration
   hook.reindex(source_index, target_index, query, **kwargs) -> Tuple[int, List]
   
   # Context manager
   with ElasticsearchHook() as hook:
       # Automatic cleanup
   ```
   
   ## Usage Examples
   
   ### Basic Usage
   ```python
   from airflow.providers.elasticsearch.hooks.elasticsearch import ElasticsearchHook
   
   # Using default connection
   hook = ElasticsearchHook()
   
   # Test connection
   if hook.test_connection():
       print("Connected successfully!")
   ```
   
   ### Search with Pandas
   ```python
   # Convert search results to DataFrame
   df = hook.search_to_pandas(
       index="my_index",
       query={"match_all": {}}
   )
   ```
   
   ### Bulk Operations
   ```python
   actions = [
       {"_index": "my_index", "_source": {"field": "value1"}},
       {"_index": "my_index", "_source": {"field": "value2"}}
   ]
   
   success_count, errors = hook.bulk(actions)
   ```
   
   ### Index Management
   ```python
   # Create index with mappings
   hook.create_index(
       index_name="my_index",
       mappings={"properties": {"field": {"type": "text"}}},
       settings={"number_of_shards": 1}
   )
   ```
   
   ## Breaking Changes
   
   - `ElasticsearchPythonHook` is now deprecated (with runtime warning)
   - New users should use `ElasticsearchHook` instead
   
   ## Migration Guide
   
   **Before (deprecated):**
   ```python
   from airflow.providers.elasticsearch.hooks.elasticsearch import ElasticsearchPythonHook
   
   hook = ElasticsearchPythonHook(hosts=["http://localhost:9200"])
   ```
   
   **After (recommended):**
   ```python
   from airflow.providers.elasticsearch.hooks.elasticsearch import ElasticsearchHook
   
   hook = ElasticsearchHook(elasticsearch_conn_id="elasticsearch_default")
   ```
   
   ## Tests
   
   - ✅ All existing tests pass
   - ✅ Added comprehensive unit tests for new `ElasticsearchHook`
   - ✅ Tests cover all new methods and error scenarios
   - ✅ Mock-based testing to avoid external dependencies
   
   ## Documentation
   
   - ✅ Added comprehensive documentation in `providers/elasticsearch/docs/hooks/elasticsearch_hook.rst`
   - ✅ API reference with detailed method documentation
   - ✅ Migration guide from deprecated hook
   
   ## Backwards Compatibility
   
   - ✅ All existing functionality remains unchanged
   - ✅ `ElasticsearchPythonHook` continues to work (with deprecation warning)
   - ✅ No breaking changes for current users
   
   ## Dependencies
   
   - ✅ pandas import is lazy (only when needed)
   - ✅ No additional required dependencies
   - ✅ Optional pandas dependency clearly documented
   
   ## Related Issues
   
   None
   
   This enhancement provides a more comprehensive and Airflow-native way to interact with Elasticsearch, making it easier for users to integrate Elasticsearch operations into their DAGs while maintaining backwards compatibility.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@airflow.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Enhanced Elasticsearch provider with comprehensive ElasticsearchHook [airflow]

Posted by "armandmasseaugit (via GitHub)" <gi...@apache.org>.
armandmasseaugit commented on PR #54259:
URL: https://github.com/apache/airflow/pull/54259#issuecomment-3365546671

   Hey @Programmer-RD-AI can you review this please ? Thanks a lot !


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@airflow.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Enhanced Elasticsearch provider with comprehensive ElasticsearchHook [airflow]

Posted by "armandmasseaugit (via GitHub)" <gi...@apache.org>.
armandmasseaugit commented on PR #54259:
URL: https://github.com/apache/airflow/pull/54259#issuecomment-6167797477

   Hi ! Is is possible to re-open it ?


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@airflow.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Enhanced Elasticsearch provider with comprehensive ElasticsearchHook [airflow]

Posted by "armandmasseaugit (via GitHub)" <gi...@apache.org>.
armandmasseaugit commented on PR #54259:
URL: https://github.com/apache/airflow/pull/54259#issuecomment-3552062444

   Hey @ashb @uranusjr @eladkal can you review the code please ? Thanks a lot !


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@airflow.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Enhanced Elasticsearch provider with comprehensive ElasticsearchHook [airflow]

Posted by "armandmasseaugit (via GitHub)" <gi...@apache.org>.
armandmasseaugit commented on PR #54259:
URL: https://github.com/apache/airflow/pull/54259#issuecomment-3199390035

   Thank you very much for the review ! I commited your suggestions. 


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@airflow.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Enhanced Elasticsearch provider with comprehensive ElasticsearchHook [airflow]

Posted by "potiuk (via GitHub)" <gi...@apache.org>.
potiuk commented on PR #54259:
URL: https://github.com/apache/airflow/pull/54259#issuecomment-3765292096

   > Done ! Thank you
   
   Well ... still errors 


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@airflow.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Enhanced Elasticsearch provider with comprehensive ElasticsearchHook [airflow]

Posted by "potiuk (via GitHub)" <gi...@apache.org>.
potiuk commented on PR #54259:
URL: https://github.com/apache/airflow/pull/54259#issuecomment-3661941614

   Can you rebase it please ? that will put it on top of PRs to review.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@airflow.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Enhanced Elasticsearch provider with comprehensive ElasticsearchHook [airflow]

Posted by "github-actions[bot] (via GitHub)" <gi...@apache.org>.
github-actions[bot] commented on PR #54259:
URL: https://github.com/apache/airflow/pull/54259#issuecomment-4008680302

   This pull request has been automatically marked as stale because it has not had recent activity. It will be closed in 5 days if no further activity occurs. Thank you for your contributions.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@airflow.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Enhanced Elasticsearch provider with comprehensive ElasticsearchHook [airflow]

Posted by "github-actions[bot] (via GitHub)" <gi...@apache.org>.
github-actions[bot] closed pull request #54259: Enhanced Elasticsearch provider with comprehensive ElasticsearchHook
URL: https://github.com/apache/airflow/pull/54259


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@airflow.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Enhanced Elasticsearch provider with comprehensive ElasticsearchHook [airflow]

Posted by "armandmasseaugit (via GitHub)" <gi...@apache.org>.
armandmasseaugit commented on PR #54259:
URL: https://github.com/apache/airflow/pull/54259#issuecomment-3703803925

   Done ! Thank you


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@airflow.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Enhanced Elasticsearch provider with comprehensive ElasticsearchHook [airflow]

Posted by "Programmer-RD-AI (via GitHub)" <gi...@apache.org>.
Programmer-RD-AI commented on code in PR #54259:
URL: https://github.com/apache/airflow/pull/54259#discussion_r2280571447


##########
providers/elasticsearch/src/airflow/providers/elasticsearch/hooks/elasticsearch.py:
##########
@@ -235,20 +241,28 @@ class ElasticsearchPythonHook(BaseHook):
     """
     Interacts with Elasticsearch. This hook uses the official Elasticsearch Python Client.
 
+    .. deprecated:: 2.10.0
+        This hook is deprecated. Use :class:`~airflow.providers.elasticsearch.hooks.elasticsearch.ElasticsearchHook` instead.
+
     :param hosts: list: A list of a single or many Elasticsearch instances. Example: ["http://localhost:9200"]
     :param es_conn_args: dict: Additional arguments you might need to enter to connect to Elasticsearch.
                                 Example: {"ca_cert":"/path/to/cert", "basic_auth": "(user, pass)"}
     """
 
     def __init__(self, hosts: list[Any], es_conn_args: dict | None = None):

Review Comment:
   Optional: add `-> None` to make the return type explicit.
   
   ```suggestion
       def __init__(self, hosts: list[Any], es_conn_args: dict | None = None) -> None:
   ```



##########
providers/elasticsearch/src/airflow/providers/elasticsearch/hooks/elasticsearch.py:
##########
@@ -268,3 +282,448 @@ def search(self, query: dict[Any, Any], index: str = "_all") -> dict:
         es_client = self.get_conn
         result = es_client.search(index=index, body=query)
         return result["hits"]
+
+
+class ElasticsearchHook(BaseHook):
+    """
+    Hook for interacting with Elasticsearch.
+
+    This hook provides a convenient interface to Elasticsearch operations
+    including search, bulk operations, and data management.
+    """
+
+    conn_name_attr = "elasticsearch_conn_id"
+    default_conn_name = "elasticsearch_default"
+    conn_type = "elasticsearch"
+    hook_name = "Elasticsearch"
+
+    def __init__(
+        self, elasticsearch_conn_id: str = "elasticsearch_default", log_query: bool = False, **kwargs: Any
+    ) -> None:
+        """
+        Initialize the Elasticsearch Hook.
+
+        :param elasticsearch_conn_id: The Airflow connection ID for Elasticsearch.
+            Default: *elasticsearch_default*.
+        :param log_query: If *True*, queries will be logged for debugging purposes.
+            Default: *False*.
+        :param kwargs: Additional arguments passed to the parent BaseHook class.
+        """
+        import os
+
+        super().__init__()
+        self.conn_id = elasticsearch_conn_id
+        self.log_query = log_query
+
+        # Environment variables as fallback configuration
+        self.vars: dict[str, str | bool | None] = {
+            "host": os.getenv("ELASTICSEARCH_HOST"),
+            "port": os.getenv("ELASTICSEARCH_PORT"),
+            "username": os.getenv("ELASTICSEARCH_USERNAME"),
+            "password": os.getenv("ELASTICSEARCH_PASSWORD"),
+            "use_ssl": os.getenv("ELASTICSEARCH_USE_SSL", "false").lower() == "true",
+            "verify_certs": os.getenv("ELASTICSEARCH_VERIFY_CERTS", "true").lower() == "true",
+            "timeout": os.getenv("ELASTICSEARCH_TIMEOUT"),
+            "max_retries": os.getenv("ELASTICSEARCH_MAX_RETRIES"),
+        }
+
+    @cached_property
+    def conn(self) -> "AirflowConnection":
+        """Get the Airflow connection object for Elasticsearch."""
+        return self.get_connection(self.conn_id)
+
+    @cached_property
+    def client(self) -> Elasticsearch:
+        """
+        Create and return an Elasticsearch client with environment variable fallback.
+
+        Configuration priority:
+        1. Airflow connection (highest priority)
+        2. Environment variables (fallback)
+        3. Default values (last resort)
+
+        :return: Configured Elasticsearch client instance.
+        :raises AirflowConfigException: If client creation fails due to configuration issues.
+        """
+        # Get Airflow connection
+        conn = self.get_connection(self.conn_id)
+
+        # Configuration with fallback priority: connection -> env vars -> defaults
+        host = conn.host or self.vars["host"] or "localhost"
+        port = conn.port or (int(self.vars["port"]) if self.vars["port"] else None) or 9200
+        schema = conn.schema or ("https" if self.vars["use_ssl"] else "http")
+
+        # Build hosts list
+        hosts = [f"{schema}://{host}:{port}"]
+        client_args: dict[str, Any] = {"hosts": hosts}

Review Comment:
   Optional: Using `Any` here makes the type a bit too loose.  
   Might be clearer to define a more specific type for `client_args` (e.g. `dict[str, str | int | bool]` or a TypedDict) 
   so it’s easier to see what values are expected.
   



##########
providers/elasticsearch/src/airflow/providers/elasticsearch/hooks/elasticsearch.py:
##########
@@ -268,3 +282,448 @@ def search(self, query: dict[Any, Any], index: str = "_all") -> dict:
         es_client = self.get_conn
         result = es_client.search(index=index, body=query)
         return result["hits"]
+
+
+class ElasticsearchHook(BaseHook):
+    """
+    Hook for interacting with Elasticsearch.
+
+    This hook provides a convenient interface to Elasticsearch operations
+    including search, bulk operations, and data management.
+    """
+
+    conn_name_attr = "elasticsearch_conn_id"
+    default_conn_name = "elasticsearch_default"
+    conn_type = "elasticsearch"
+    hook_name = "Elasticsearch"
+
+    def __init__(
+        self, elasticsearch_conn_id: str = "elasticsearch_default", log_query: bool = False, **kwargs: Any
+    ) -> None:
+        """
+        Initialize the Elasticsearch Hook.
+
+        :param elasticsearch_conn_id: The Airflow connection ID for Elasticsearch.
+            Default: *elasticsearch_default*.
+        :param log_query: If *True*, queries will be logged for debugging purposes.
+            Default: *False*.
+        :param kwargs: Additional arguments passed to the parent BaseHook class.
+        """
+        import os
+
+        super().__init__()
+        self.conn_id = elasticsearch_conn_id
+        self.log_query = log_query
+
+        # Environment variables as fallback configuration
+        self.vars: dict[str, str | bool | None] = {
+            "host": os.getenv("ELASTICSEARCH_HOST"),
+            "port": os.getenv("ELASTICSEARCH_PORT"),
+            "username": os.getenv("ELASTICSEARCH_USERNAME"),
+            "password": os.getenv("ELASTICSEARCH_PASSWORD"),
+            "use_ssl": os.getenv("ELASTICSEARCH_USE_SSL", "false").lower() == "true",
+            "verify_certs": os.getenv("ELASTICSEARCH_VERIFY_CERTS", "true").lower() == "true",
+            "timeout": os.getenv("ELASTICSEARCH_TIMEOUT"),
+            "max_retries": os.getenv("ELASTICSEARCH_MAX_RETRIES"),
+        }
+
+    @cached_property
+    def conn(self) -> "AirflowConnection":
+        """Get the Airflow connection object for Elasticsearch."""
+        return self.get_connection(self.conn_id)
+
+    @cached_property
+    def client(self) -> Elasticsearch:
+        """
+        Create and return an Elasticsearch client with environment variable fallback.
+
+        Configuration priority:
+        1. Airflow connection (highest priority)
+        2. Environment variables (fallback)
+        3. Default values (last resort)
+
+        :return: Configured Elasticsearch client instance.
+        :raises AirflowConfigException: If client creation fails due to configuration issues.
+        """
+        # Get Airflow connection
+        conn = self.get_connection(self.conn_id)
+
+        # Configuration with fallback priority: connection -> env vars -> defaults
+        host = conn.host or self.vars["host"] or "localhost"
+        port = conn.port or (int(self.vars["port"]) if self.vars["port"] else None) or 9200

Review Comment:
   Might be safer to use `.get()` when accessing `self.vars` (e.g. `self.vars.get("host")`) 
   to avoid potential `KeyError`s if the key is missing. Keeps the same fallback behavior 
   without assuming the key is always present.
   



##########
providers/elasticsearch/src/airflow/providers/elasticsearch/hooks/elasticsearch.py:
##########
@@ -268,3 +282,448 @@ def search(self, query: dict[Any, Any], index: str = "_all") -> dict:
         es_client = self.get_conn
         result = es_client.search(index=index, body=query)
         return result["hits"]
+
+
+class ElasticsearchHook(BaseHook):
+    """
+    Hook for interacting with Elasticsearch.
+
+    This hook provides a convenient interface to Elasticsearch operations
+    including search, bulk operations, and data management.
+    """
+
+    conn_name_attr = "elasticsearch_conn_id"
+    default_conn_name = "elasticsearch_default"
+    conn_type = "elasticsearch"
+    hook_name = "Elasticsearch"
+
+    def __init__(
+        self, elasticsearch_conn_id: str = "elasticsearch_default", log_query: bool = False, **kwargs: Any

Review Comment:
   Optional: Instead of hardcoding `"elasticsearch_default"`, this could fall back to the class-level 
   `default_conn_name`. That way the default only needs to be maintained in one place.
   
   ```suggestion
           self, elasticsearch_conn_id: str = None, log_query: bool = False, **kwargs: Any
   ```



##########
providers/elasticsearch/src/airflow/providers/elasticsearch/hooks/elasticsearch.py:
##########
@@ -268,3 +282,448 @@ def search(self, query: dict[Any, Any], index: str = "_all") -> dict:
         es_client = self.get_conn
         result = es_client.search(index=index, body=query)
         return result["hits"]
+
+
+class ElasticsearchHook(BaseHook):
+    """
+    Hook for interacting with Elasticsearch.
+
+    This hook provides a convenient interface to Elasticsearch operations
+    including search, bulk operations, and data management.
+    """
+
+    conn_name_attr = "elasticsearch_conn_id"
+    default_conn_name = "elasticsearch_default"
+    conn_type = "elasticsearch"
+    hook_name = "Elasticsearch"
+
+    def __init__(
+        self, elasticsearch_conn_id: str = "elasticsearch_default", log_query: bool = False, **kwargs: Any
+    ) -> None:
+        """
+        Initialize the Elasticsearch Hook.
+
+        :param elasticsearch_conn_id: The Airflow connection ID for Elasticsearch.
+            Default: *elasticsearch_default*.
+        :param log_query: If *True*, queries will be logged for debugging purposes.
+            Default: *False*.
+        :param kwargs: Additional arguments passed to the parent BaseHook class.
+        """
+        import os
+
+        super().__init__()
+        self.conn_id = elasticsearch_conn_id
+        self.log_query = log_query
+
+        # Environment variables as fallback configuration
+        self.vars: dict[str, str | bool | None] = {
+            "host": os.getenv("ELASTICSEARCH_HOST"),
+            "port": os.getenv("ELASTICSEARCH_PORT"),
+            "username": os.getenv("ELASTICSEARCH_USERNAME"),
+            "password": os.getenv("ELASTICSEARCH_PASSWORD"),
+            "use_ssl": os.getenv("ELASTICSEARCH_USE_SSL", "false").lower() == "true",
+            "verify_certs": os.getenv("ELASTICSEARCH_VERIFY_CERTS", "true").lower() == "true",
+            "timeout": os.getenv("ELASTICSEARCH_TIMEOUT"),
+            "max_retries": os.getenv("ELASTICSEARCH_MAX_RETRIES"),
+        }
+
+    @cached_property
+    def conn(self) -> "AirflowConnection":
+        """Get the Airflow connection object for Elasticsearch."""
+        return self.get_connection(self.conn_id)
+
+    @cached_property
+    def client(self) -> Elasticsearch:
+        """
+        Create and return an Elasticsearch client with environment variable fallback.
+
+        Configuration priority:
+        1. Airflow connection (highest priority)
+        2. Environment variables (fallback)
+        3. Default values (last resort)
+
+        :return: Configured Elasticsearch client instance.
+        :raises AirflowConfigException: If client creation fails due to configuration issues.
+        """
+        # Get Airflow connection
+        conn = self.get_connection(self.conn_id)
+
+        # Configuration with fallback priority: connection -> env vars -> defaults
+        host = conn.host or self.vars["host"] or "localhost"
+        port = conn.port or (int(self.vars["port"]) if self.vars["port"] else None) or 9200
+        schema = conn.schema or ("https" if self.vars["use_ssl"] else "http")

Review Comment:
   For consistency with `host` and `port`, the `schema` fallback could follow the same 
   `conn → vars → default` structure, e.g.:
   
   ```suggestion
           schema = conn.schema or ("https" if self.vars.get("use_ssl") else None) or "http"
   ```



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@airflow.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Enhanced Elasticsearch provider with comprehensive ElasticsearchHook [airflow]

Posted by "armandmasseaugit (via GitHub)" <gi...@apache.org>.
armandmasseaugit commented on PR #54259:
URL: https://github.com/apache/airflow/pull/54259#issuecomment-3250503114

   Hello, just a gentle ping 😊 — let me know if anything is missing or could be improved in this PR. Thanks!
   
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@airflow.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org