diff --git a/elasticsearch/client/__init__.py b/elasticsearch/client/__init__.py
index 84ea9455..7b8ff559 100644
--- a/elasticsearch/client/__init__.py
+++ b/elasticsearch/client/__init__.py
@@ -3,7 +3,7 @@ import weakref
import logging
from ..transport import Transport
-from ..exceptions import NotFoundError, TransportError
+from ..exceptions import TransportError
from ..compat import string_types, urlparse
from .indices import IndicesClient
from .cluster import ClusterClient
@@ -204,11 +204,7 @@ class Elasticsearch(object):
Returns True if the cluster is up, False otherwise.
``_
"""
- try:
- self.transport.perform_request('HEAD', '/', params=params)
- except NotFoundError:
- return False
- return True
+ return self.transport.perform_request('HEAD', '/', params=params)
@query_params()
def info(self, params=None):
@@ -299,12 +295,8 @@ class Elasticsearch(object):
for param in (index, doc_type, id):
if param in SKIP_IN_PATH:
raise ValueError("Empty value passed for a required argument.")
- try:
- self.transport.perform_request('HEAD', _make_path(index, doc_type,
+ return self.transport.perform_request('HEAD', _make_path(index, doc_type,
id), params=params)
- except NotFoundError:
- return False
- return True
@query_params('_source', '_source_exclude', '_source_include', 'fields',
'parent', 'preference', 'realtime', 'refresh', 'routing', 'version',
@@ -1158,53 +1150,6 @@ class Elasticsearch(object):
return self.transport.perform_request('DELETE', _make_path('_search',
'template', id), params=params)
- @query_params('allow_no_indices', 'analyze_wildcard', 'analyzer',
- 'default_operator', 'df', 'expand_wildcards', 'ignore_unavailable',
- 'lenient', 'lowercase_expanded_terms', 'min_score', 'preference', 'q',
- 'routing')
- def search_exists(self, index=None, doc_type=None, body=None, params=None):
- """
- The exists API allows to easily determine if any matching documents
- exist for a provided query.
- ``_
-
- :arg index: A comma-separated list of indices to restrict the results
- :arg doc_type: A comma-separated list of types to restrict the results
- :arg body: A query to restrict the results specified with the Query DSL
- (optional)
- :arg allow_no_indices: Whether to ignore if a wildcard indices
- expression resolves into no concrete indices. (This includes `_all`
- string or when no indices have been specified)
- :arg analyze_wildcard: Specify whether wildcard and prefix queries
- should be analyzed (default: false)
- :arg analyzer: The analyzer to use for the query string
- :arg default_operator: The default operator for query string query (AND
- or OR), default 'OR', valid choices are: 'AND', 'OR'
- :arg df: The field to use as default where no field prefix is given in
- the query string
- :arg expand_wildcards: Whether to expand wildcard expression to concrete
- indices that are open, closed or both., default 'open', valid
- choices are: 'open', 'closed', 'none', 'all'
- :arg ignore_unavailable: Whether specified concrete indices should be
- ignored when unavailable (missing or closed)
- :arg lenient: Specify whether format-based query failures (such as
- providing text to a numeric field) should be ignored
- :arg lowercase_expanded_terms: Specify whether query terms should be
- lowercased
- :arg min_score: Include only documents with a specific `_score` value in
- the result
- :arg preference: Specify the node or shard the operation should be
- performed on (default: random)
- :arg q: Query in the Lucene query string syntax
- :arg routing: Specific routing value
- """
- try:
- self.transport.perform_request('POST', _make_path(index,
- doc_type, '_search', 'exists'), params=params, body=body)
- except NotFoundError:
- return False
- return True
-
@query_params('allow_no_indices', 'expand_wildcards', 'fields',
'ignore_unavailable', 'level')
def field_stats(self, index=None, body=None, params=None):
diff --git a/elasticsearch/client/indices.py b/elasticsearch/client/indices.py
index 87b9a16c..7545166a 100644
--- a/elasticsearch/client/indices.py
+++ b/elasticsearch/client/indices.py
@@ -1,5 +1,4 @@
from .utils import NamespacedClient, query_params, _make_path, SKIP_IN_PATH
-from ..exceptions import NotFoundError
class IndicesClient(NamespacedClient):
@query_params('analyzer', 'char_filters', 'field', 'filters', 'format',
@@ -213,12 +212,8 @@ class IndicesClient(NamespacedClient):
"""
if index in SKIP_IN_PATH:
raise ValueError("Empty value passed for a required argument 'index'.")
- try:
- self.transport.perform_request('HEAD', _make_path(index),
+ return self.transport.perform_request('HEAD', _make_path(index),
params=params)
- except NotFoundError:
- return False
- return True
@query_params('allow_no_indices', 'expand_wildcards', 'ignore_unavailable',
'local')
@@ -244,12 +239,8 @@ class IndicesClient(NamespacedClient):
for param in (index, doc_type):
if param in SKIP_IN_PATH:
raise ValueError("Empty value passed for a required argument.")
- try:
- self.transport.perform_request('HEAD', _make_path(index, doc_type),
+ return self.transport.perform_request('HEAD', _make_path(index, doc_type),
params=params)
- except NotFoundError:
- return False
- return True
@query_params('allow_no_indices', 'expand_wildcards', 'ignore_unavailable',
'master_timeout', 'timeout', 'update_all_types')
@@ -373,12 +364,8 @@ class IndicesClient(NamespacedClient):
:arg local: Return local information, do not retrieve the state from
master node (default: false)
"""
- try:
- self.transport.perform_request('HEAD', _make_path(index, '_alias',
+ return self.transport.perform_request('HEAD', _make_path(index, '_alias',
name), params=params)
- except NotFoundError:
- return False
- return True
@query_params('allow_no_indices', 'expand_wildcards', 'ignore_unavailable',
'local')
@@ -491,12 +478,8 @@ class IndicesClient(NamespacedClient):
"""
if name in SKIP_IN_PATH:
raise ValueError("Empty value passed for a required argument 'name'.")
- try:
- self.transport.perform_request('HEAD', _make_path('_template',
+ return self.transport.perform_request('HEAD', _make_path('_template',
name), params=params)
- except NotFoundError:
- return False
- return True
@query_params('flat_settings', 'local', 'master_timeout')
def get_template(self, name=None, params=None):
diff --git a/elasticsearch/transport.py b/elasticsearch/transport.py
index c1935590..d09f1343 100644
--- a/elasticsearch/transport.py
+++ b/elasticsearch/transport.py
@@ -329,6 +329,9 @@ class Transport(object):
status, headers, data = connection.perform_request(method, url, params, body, ignore=ignore, timeout=timeout)
except TransportError as e:
+ if method == 'HEAD' and e.status_code == 404:
+ return False
+
retry = False
if isinstance(e, ConnectionTimeout):
retry = self.retry_on_timeout
@@ -347,6 +350,9 @@ class Transport(object):
raise
else:
+ if method == 'HEAD':
+ return 200 <= status < 300
+
# connection didn't fail, confirm it's live status
self.connection_pool.mark_live(connection)
if data: