2015-12-08 2 views
17

Problem:Was ist der beste Weg, einfach alle Typen innerhalb eines bestimmten Index (und aller Indizes) in elasticsearch abzufragen und aufzulisten?Wie kann man alle Arten innerhalb eines Elasticsearch Index abfragen und auflisten?

Ich habe durch die Referenz und API gelesen, kann aber nichts Offensichtliches finden.

Ich kann Indizes mit dem Befehl list:

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

Ich kann Statistiken bekommen (die anscheinend nicht Typen enthalten) mit dem Befehl:

$ curl localhost:9200/_stats 

ich erwarten würde, dass es Würd ein einfacher Befehl so einfach sein wie:

$ curl localhost:9200/_types 

oder

$ curl localhost:9200/index_name/_types 

Danke für jede Hilfe, die Sie anbieten können.

+3

Es gibt keinen '_type' in ES Wenn Sie nur an Typen interessiert sind, dann schauen Sie sich @Andrew Whites [hier antworten] an (http://stackoverflow.com/questions/31087204/get-all-index-and-types-names-from-cluster-in) -elasticsearch) müssen Sie [installieren jq] (https://stedolan.github.io/jq/download/) für das – ChintanShah25

Antwort

20

Was Sie „Typ“ nennen, ist eigentlich ein „Mapping-Typ“ und die Art und Weise, sie zu erhalten ist einfach mit:

curl -XGET localhost:9200/_all/_mapping 

Jetzt, da Sie nur die Namen der Mapping-Typen wollen, Sie don‘ t müssen etwas installieren, da Sie einfach Python verwenden können, um nur Sie bekommen, was Sie wollen aus diesem vorherigen Antwort:

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);' 

Das Python-Skript tut etwas sehr einfach, das heißt es iteriert die Indizes und Mapping Typen und ruft nur deren Namen ab:

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

Da Sie Ruby-verwenden, der gleiche Trick ist die Verwendung von Ruby-Code zur Verfügung:

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} }" 

Der Ruby-Skript wie folgt aussieht:

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

Danke. Als ich die Dokumentation (und andere Web-Ressourcen) gelesen habe, hatte ich den Eindruck, dass Zuordnungen auf der Feld-/Attributsebene statt auf der Typenebene waren. Der _mapping-Befehl gibt mir definitiv, wonach ich suche, aber ich benutze Ruby, nicht Python, also muss ich herausfinden, wie man die Ergebnisse in Ruby analysiert. Im Moment versuche ich so viel wie möglich von der API zu verstehen, indem ich verschiedene Abfragepermutationen ausprobiere. Wie immer schätze ich die Hilfe. - Thx –

+0

Ich habe meine Antwort mit einem entsprechenden Ruby-Code aktualisiert. – 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; 
} 
Verwandte Themen