2015-12-08 23 views
17

Problema:Qual è il modo più corretto per richiedere e elencare tutti i tipi in un indice specifico (e tutti gli indici) in elasticsearch?Come interrogare ed elencare tutti i tipi all'interno di un indice elasticsearch?

Ho letto il riferimento e l'API ma non riesco a trovare nulla di ovvio.

posso elencare gli indici con il comando:

$ curl 'localhost:9200/_cat/indices?v' 

posso ottenere statistiche (che non sembrano per includere i tipi) con il comando:

$ curl localhost:9200/_stats 

mi aspetto che ci 'd un comando semplice come semplice come:

$ curl localhost:9200/_types 

o

$ curl localhost:9200/index_name/_types 

Grazie per l'aiuto che puoi offrire.

+3

Non c'è '_type' in ES , se sei interessato solo ai tipi, dai un'occhiata a @Andrew White's [answer here] (http://stackoverflow.com/questions/31087204/get-all-index-and-types-names-from-cluster-in -elasticsearch) sarà necessario [installare jq] (https://stedolan.github.io/jq/download/) per tale – ChintanShah25

risposta

20

Quello che tu chiami "tipo" è in realtà un "tipo di mappatura" e il modo per farli è semplicemente utilizzando:

curl -XGET localhost:9200/_all/_mapping 

Ora, poiché desideri solo i nomi dei tipi di mappatura, si don' t bisogno di installare nulla, come si può utilizzare semplicemente utilizzare Python per ottenere solo ciò che vuoi da quella risposta precedente:

curl -XGET localhost:9205/_all/_mapping | python -c 'import json,sys; indices=json.load(sys.stdin); indices = [type for index in indices for type in indices.get(index).get("mappings")]; print list(indices);' 

sceneggiatura Il Python fa qualcosa di molto semplice, vale a dire che itera su tutti gli indici e la mappatura tipi e recupera solo i nomi di quest'ultimo:

import json,sys; 
resp = json.load(sys.stdin); 
indices = [type for index in resp for type in indices.get(index).get("mappings")]; 
print list(indices);' 

UPDATE

Dal momento che si sta utilizzando Ruby, lo stesso trucco è disponibile tramite codice Ruby:

curl -XGET localhost:9205/_all/_mapping | ruby -e "require 'rubygems'; require 'json'; resp = JSON.parse(STDIN.read); resp.each { |index, indexSpec | indexSpec['mappings'].each {|type, fields| puts type} }" 

Lo script di Ruby si presenta così:

require 'rubygems'; 
require 'json'; 
resp = JSON.parse(STDIN.read); 
resp.each { |index, indexSpec | 
    indexSpec['mappings'].each { |type, fields| 
     puts type 
    } 
} 
+1

Grazie. Mentre stavo leggendo la documentazione (e altre risorse web) ho avuto l'impressione che i mapping fossero al livello campo/attributo, non a livello di testo. Il comando _mapping mi dà sicuramente quello che sto cercando, ma sto usando Ruby, non Python, quindi dovrò capire come analizzare i risultati in Ruby. In questo momento, sto solo cercando di capire il più possibile dell'API provando diverse permutazioni di query. Come sempre, apprezzo l'aiuto. - Thx –

+0

Ho aggiornato la mia risposta con un codice Ruby equivalente. – Val

0
private Set<String> getTypes(String indexName) throws Exception{ 
    HttpClient client = HttpClients.createDefault(); 
    HttpGet mappingsRequest = new HttpGet(getServerUri()+"/"+getIndexName()+"/_mappings"); 
    HttpResponse scanScrollResponse = client.execute(mappingsRequest); 
    String response = IOUtils.toString(scanScrollResponse.getEntity().getContent(), Charset.defaultCharset()); 
    System.out.println(response); 
    String mappings = ((JSONObject)JSONSerializer.toJSON(JSONObject.fromObject(response).get(indexName).toString())).get("mappings").toString(); 
    Set<String> types = JSONObject.fromObject(mappings).keySet(); 
    return types; 
} 
Problemi correlati