J'aimerais répertorier tous les index présents sur un serveur ElasticSearch. J'ai essayé ceci:
curl -XGET localhost:9200/
mais cela me donne juste ceci:
{
"ok" : true,
"status" : 200,
"name" : "El Aguila",
"version" : {
"number" : "0.19.3",
"snapshot_build" : false
},
"tagline" : "You Know, for Search"
}
Je veux une liste de tous les index ..
Pour obtenir une liste concise de tous les index de votre cluster, appelez
curl http://localhost:9200/_aliases
cela vous donnera une liste d'index et leurs alias.
Si vous voulez que ce soit joliment imprimé, ajoutez pretty=1
:
curl http://localhost:9200/_aliases?pretty=1
Le résultat ressemblera à ceci, si vos index s'appellent old_deuteronomy
et mungojerrie
:
{
"old_deuteronomy" : {
"aliases" : { }
},
"mungojerrie" : {
"aliases" : {
"rumpleteazer" : { },
"that_horrible_cat" : { }
}
}
}
Essayer
curl 'localhost:9200/_cat/indices?v'
Je vais vous donner ci-dessous une sortie explicative de manière tabulaire
health index pri rep docs.count docs.deleted store.size pri.store.size
yellow customer 5 1 0 0 495b 495b
Vous pouvez interroger localhost:9200/_status
et cela vous donnera une liste d'index et d'informations sur chacun. La réponse ressemblera à ceci:
{
"ok" : true,
"_shards" : { ... },
"indices" : {
"my_index" : { ... },
"another_index" : { ... }
}
}
La commande _stats permet de personnaliser les résultats en spécifiant les métriques souhaitées. Pour obtenir les index, la requête est la suivante:
GET /_stats/indices
Le format général de la requête _stats
est le suivant:
/_stats
/_stats/{metric}
/_stats/{metric}/{indexMetric}
/{index}/_stats
/{index}/_stats/{metric}
Où les métriques sont:
indices, docs, store, indexing, search, get, merge,
refresh, flush, warmer, filter_cache, id_cache,
percolate, segments, fielddata, completion
À titre d’exercice, j’ai écrit un petit plugin elasticsearch qui fournit la fonctionnalité permettant de répertorier les indices elasticsearch sans aucune autre information. Vous pouvez le trouver à l'URL suivante:
http://blog.iterativ.ch/2014/04/11/listindices-writing-your-first-elasticsearch-Java-plugin/
J'utilise ceci pour obtenir tous les indices:
$ curl --silent 'http://127.0.0.1:9200/_cat/indices' | cut -d\ -f3
Avec cette liste, vous pouvez travailler sur ...
$ curl -s 'http://localhost:9200/_cat/indices' | head -5
green open qa-abcdefq_1458925279526 1 6 0 0 1008b 144b
green open qa-test_learnq_1460483735129 1 6 0 0 1008b 144b
green open qa-testimportd_1458925361399 1 6 0 0 1008b 144b
green open qa-test123p_reports 1 6 3868280 25605 5.9gb 870.5mb
green open qa-dan050216p_1462220967543 1 6 0 0 1008b 144b
Pour obtenir la 3ème colonne ci-dessus (noms des index):
$ curl -s 'http://localhost:9200/_cat/indices' | head -5 | cut -d\ -f3
qa-abcdefq_1458925279526
qa-test_learnq_1460483735129
qa-testimportd_1458925361399
qa-test123p_reports
qa-dan050216p_1462220967543
REMARQUE: Vous pouvez également utiliser awk '{print $3}'
au lieu de cut -d\ -f3
.
Vous pouvez également suffixer la requête avec un ?v
pour ajouter un en-tête de colonne. Cela romprait la méthode cut...
et je vous recommande donc d'utiliser la sélection awk..
à ce stade.
$ curl -s 'http://localhost:9200/_cat/indices?v' | head -5
health status index pri rep docs.count docs.deleted store.size pri.store.size
green open qa-abcdefq_1458925279526 1 6 0 0 1008b 144b
green open qa-test_learnq_1460483735129 1 6 0 0 1008b 144b
green open qa-testimportd_1458925361399 1 6 0 0 1008b 144b
green open qa-test123p_reports 1 6 3868280 25605 5.9gb 870.5mb
Je recommanderais également de faire/_cat/indices, ce qui donne une liste lisible de vos index.
curl -XGET 'http://localhost:9200/_cluster/health?level=indices'
Cela va sortir comme ci-dessous
{
"cluster_name": "XXXXXX:name",
"status": "green",
"timed_out": false,
"number_of_nodes": 3,
"number_of_data_nodes": 3,
"active_primary_shards": 199,
"active_shards": 398,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 0,
"delayed_unassigned_shards": 0,
"number_of_pending_tasks": 0,
"number_of_in_flight_fetch": 0,
"task_max_waiting_in_queue_millis": 0,
"active_shards_percent_as_number": 100,
"indices": {
"logstash-2017.06.19": {
"status": "green",
"number_of_shards": 3,
"number_of_replicas": 1,
"active_primary_shards": 3,
"active_shards": 6,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 0
},
"logstash-2017.06.18": {
"status": "green",
"number_of_shards": 3,
"number_of_replicas": 1,
"active_primary_shards": 3,
"active_shards": 6,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 0
}}
Je vais vous donner la requête que vous pouvez exécuter sur kibana.
GET /_cat/indices?v
et la version CURL sera
CURL -XGET http://localhost:9200/_cat/indices?v
_stats/indices
donne le résultat avec indices
.
$ curl -XGET "localhost:9200/_stats/indices?pretty=true"
{
"_shards" : {
"total" : 10,
"successful" : 5,
"failed" : 0
},
"_all" : {
"primaries" : { },
"total" : { }
},
"indices" : {
"visitors" : {
"primaries" : { },
"total" : { }
}
}
}
Essayez cette API de chat: elle vous donnera la liste de tous les indices avec la santé et d’autres détails.
CURL -XGET http: // localhost: 9200/_cat/indices
Le moyen le plus simple d'obtenir une liste d'index uniquement est d'utiliser la réponse ci-dessus, avec le paramètre 'h = index':
curl -XGET "localhost:9200/_cat/indices?h=index"
Les gens ici ont expliqué comment le faire en boucle et en sens, certaines personnes pourraient avoir besoin de le faire en Java.
Le voici
client.admin().indices().stats(new IndicesStatsRequest()).actionGet().getIndices().keySet()
J'utilise le point final _stats/indexes
pour obtenir un blob JSON de données, puis filtrer avec jq .
curl 'localhost:9200/_stats/indexes' | jq '.indices | keys | .[]'
"admin"
"blazeds"
"cgi-bin"
"contacts_v1"
"flex2gateway"
"formmail"
"formmail.pl"
"gw"
...
Si vous ne voulez pas de guillemets, ajoutez un drapeau -r
à jq.
Oui, le noeud final est indexes
et la clé de données est indices
. Ils ne peuvent donc pas se décider :)
J'avais besoin de cela pour nettoyer ces index de déchets créés par un scan de sécurité interne (nessus).
PS. Je vous recommande fortement de vous familiariser avec jq si vous allez interagir avec ES à partir de la ligne de commande.
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>2.4.0</version>
</dependency>
API Java
Settings settings = Settings.settingsBuilder().put("cluster.name", Consts.ES_CLUSTER_NAME).build();
TransportClient client = TransportClient.builder().settings(settings).build().addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("52.43.207.11"), 9300));
IndicesAdminClient indicesAdminClient = client.admin().indices();
GetIndexResponse getIndexResponse = indicesAdminClient.getIndex(new GetIndexRequest()).get();
for (String index : getIndexResponse.getIndices()) {
logger.info("[index:" + index + "]");
}
vous pouvez essayer cette commande
curl -X GET http: // localhost: 9200/_cat/indices? v
Kibana et ES ont été installés sur une machine. Mais je ne connaissais pas les détails (sur quel chemin ou port) était le nœud ES sur cette machine.
Alors, comment pouvez-vous le faire à partir de Kibana (version 5.6)?
GET _cat/indices
Je voulais connaître la taille d'un index ES particulier
Pour lister les index que vous pouvez faire: curl 'localhost: 9200/_cat/indices? V' Elasticsearch Documentation
Pour Elasticsearch 6.X, les éléments suivants ont été les plus utiles. Chacun fournit des données différentes dans la réponse.
# more verbose
curl -sS 'localhost:9200/_stats' | jq -C ".indices" | less
# less verbose, summary
curl -sS 'localhost:9200/_cluster/health?level=indices' | jq -C ".indices" | less
voici une autre façon de voir les indices dans la base de données:
curl -sG somehost-dev.example.com:9200/_status --user "credentials:password" | sed 's/,/\n/g' | grep index | grep -v "size_in" | uniq
{ "index":"tmpdb"}
{ "index":"devapp"}
L'un des meilleurs moyens de lister les index + d'afficher son statut avec list: est simplement d'exécuter la requête ci-dessous.
Remarque: utilisez de préférence Sense pour obtenir le bon résultat.
curl -XGET 'http://localhost:9200/_cat/shards'
L'exemple de sortie est comme ci-dessous. Le principal avantage est qu’il affiche essentiellement le nom de l’index et les fragments dans lesquels il est enregistré, la taille de l’index et les fragments, etc.
index1 0 p STARTED 173650 457.1mb 192.168.0.1 ip-192.168.0.1
index1 0 r UNASSIGNED
index2 1 p STARTED 173435 456.6mb 192.168.0.1 ip-192.168.0.1
index2 1 r UNASSIGNED
...
...
...
You may use this command line.
curl -X GET "localhost: 9200/_cat/indices? v"
Pour plus (Site officiel Elasticsearch)
Si vous travaillez dans scala, un moyen de le faire et d'utiliser Future
est de créer un RequestExecutor, puis d'utiliser IndicesStatsRequestBuilder et le client d'administration pour soumettre votre demande.
import org.elasticsearch.action.{ ActionRequestBuilder, ActionListener, ActionResponse }
import scala.concurrent.{ Future, Promise, blocking }
/** Convenice wrapper for creating RequestExecutors */
object RequestExecutor {
def apply[T <: ActionResponse](): RequestExecutor[T] = {
new RequestExecutor[T]
}
}
/** Wrapper to convert an ActionResponse into a scala Future
*
* @see http://chris-zen.github.io/software/2015/05/10/elasticsearch-with-scala-and-akka.html
*/
class RequestExecutor[T <: ActionResponse] extends ActionListener[T] {
private val promise = Promise[T]()
def onResponse(response: T) {
promise.success(response)
}
def onFailure(e: Throwable) {
promise.failure(e)
}
def execute[RB <: ActionRequestBuilder[_, T, _, _]](request: RB): Future[T] = {
blocking {
request.execute(this)
promise.future
}
}
}
L’exécuteur est levé de this blog post , qui est certainement une bonne lecture si vous essayez d’interroger ES par programmation et non par curl. Une fois que vous avez ceci, vous pouvez créer une liste de tous les index assez facilement, comme ceci:
def totalCountsByIndexName(): Future[List[(String, Long)]] = {
import scala.collection.JavaConverters._
val statsRequestBuider = new IndicesStatsRequestBuilder(client.admin().indices())
val futureStatResponse = RequestExecutor[IndicesStatsResponse].execute(statsRequestBuider)
futureStatResponse.map { indicesStatsResponse =>
indicesStatsResponse.getIndices().asScala.map {
case (k, indexStats) => {
val indexName = indexStats.getIndex()
val totalCount = indexStats.getTotal().getDocs().getCount()
(indexName, totalCount)
}
}.toList
}
}
client
est une instance de Client qui peut être un noeud ou un client de transport, selon vos besoins. Vous devez également avoir une variable implicite ExecutionContext
pour cette demande. Si vous essayez de compiler ce code sans celui-ci, le compilateur scala vous avertira de la façon de l'obtenir si vous n'en avez pas déjà importé.
J'avais besoin du nombre de documents, mais si vous n'avez vraiment besoin que des noms d'index, vous pouvez les extraire des clés de la carte plutôt que de la variable IndexStats
:
indicesStatsResponse.getIndices().keySet()
Cette question apparaît lorsque vous cherchez comment faire cela, même si vous essayez de le faire par programme. J'espère donc que cela aidera tous ceux qui cherchent à le faire en scala/Java. Autrement, les utilisateurs de curl peuvent simplement faire ce que la réponse principale dit et utiliser
curl http://localhost:9200/_aliases
You can also get specific index using
curl -X GET "localhost:9200/<INDEX_NAME>"
e.g. curl -X GET "localhost:9200/Twitter"
You may get output like:
{
"Twitter": {
"aliases": {
},
"mappings": {
},
"settings": {
"index": {
"creation_date": "1540797250479",
"number_of_shards": "3",
"number_of_replicas": "2",
"uuid": "CHYecky8Q-ijsoJbpXP95w",
"version": {
"created": "6040299"
},
"provided_name": "Twitter"
}
}
}
}
For more info [https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-get-index.html][1]