82

How would I get a list of the names of an index in Python? Here is what I have so far:

>>> es=e.es
>>> es
<Elasticsearch([{'host': '14555f777d8097.us-east-1.aws.found.io', 'port': 9200}])>
>>> es.indices
<elasticsearch.client.indices.IndicesClient object at 0x10de86790>
# how to get a list of all indexes in this cluster?
David542
  • 104,438
  • 178
  • 489
  • 842
  • 1
    Have you tried the [`get_aliases()`](https://elasticsearch-py.readthedocs.org/en/latest/api.html#elasticsearch.client.IndicesClient.get_aliases) method? According to [this example](https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-aliases.html#_examples_2), you should be able to use a wildcard `*` to get all indexes. – Morgan Thrapp Aug 10 '15 at 20:33

9 Answers9

97

This question comes up when searching for information on retrieving aliases using the python-elasticsearch library. The accepted answer says to use get_aliases but that method has been removed (as of 2017). To get aliases, you can use the following:

 es.indices.get_alias("*")

UPDATE

The latest usage should be with a keyword arg:

es.indices.get_alias(index="*")
erewok
  • 7,555
  • 3
  • 33
  • 45
  • 1
    This now raises a DeprecationWarning (see https://github.com/elastic/elasticsearch-py/issues/1698). I believe that the correct way to use it is now: ` es.indices.get_alias(index="*")`. – Arcturus B Jan 13 '23 at 08:54
51

To get a list of all the indexes in a cluster, use a wildcard.

This works with elasticsearch-py.

# Python 2
for index in es.indices.get('*'):
  print index

# Python 3
for index in es.indices.get('*'):
  print(index)
Gino Mempin
  • 25,369
  • 29
  • 96
  • 135
pascal
  • 757
  • 1
  • 7
  • 8
42

Here is one way to do it with the get_alias() method:

>>> indices=es.indices.get_alias().keys()
>>> sorted(indices)
[u'avails', u'hey', u'kibana-int']
andreihondrari
  • 5,743
  • 5
  • 30
  • 59
David542
  • 104,438
  • 178
  • 489
  • 842
3

If you are willing to use pyelasticsearch module they have support for the GET _mapping command, which produces the schema of the cluster. This will allow you to see the indices, and drill into each index to see doc_types, and their fields, etc. Here's an example:

import pyelasticsearch as pyes
es = pyes.ElasticSearch(["http://hostname0:9200", "http://hostname1:9200"]) ## don't accidentally type Elasticsearch, the class from the other two modules
schema = es.get_mapping() ## python dict with the map of the cluster

To get just the list of indices,

indices_full_list = schema.keys()
just_indices = [index for index in indices_full_list if not index.startswith(".")] ## remove the objects created by marvel, e.g. ".marvel-date"

This is related to this question

Community
  • 1
  • 1
travelingbones
  • 7,919
  • 6
  • 36
  • 43
3

You can use the Cat API:es.cat.indices(h='index', s='index').split()

adamo
  • 3,584
  • 1
  • 18
  • 23
2

I use curl to call the stats API and get information about the indices. Then I parse the JSON object that is returned to find the index names.

curl localhost:9200/_stats

In Python you can call curl using the requests library. I don't know of a way to do this using the Elasticsearch or Elasticsearch-DSL Python library.

MauricioRoman
  • 832
  • 1
  • 9
  • 15
2

You can get _mapping to get list of all indexes by doing something like that.

requests.get(full_elastic_url + "/_mapping")
Ahmed
  • 2,825
  • 1
  • 25
  • 39
1

_cat API seems the right way to do this, since the _aliases way of doing will soon be removed by elasticsearch since it exposes the system indices.

indices = es.cat.indices(h='index', s='index').split()

It did the job for me.

0

If you want 'alias name' and not 'index name', here the perfect solution:

response = es.indices.get(indexname)
alias_names = list(response[indexname]['aliases'].keys())

In alias_names we get list of alias names on a particular index.

karel
  • 5,489
  • 46
  • 45
  • 50