2015-12-08 18 views
17

Sorun:Belirli bir dizinin (ve tüm indislerin) içindeki tüm türleri sorgulamak ve listelemek için en doğru yol hangisidir?Bir elasticsearch dizini içindeki tüm türler nasıl sorgulanır ve listelenir?

Referans ve API aracılığıyla okuyordum ancak açık bir şey bulabiliyor gibi görünmüyor.

Ben komutuyla endeks listeleyebilirsiniz:

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

alıyorum komutuyla (türlerini dahil görünmüyor) istatistik edebilirsiniz:

$ curl localhost:9200/_stats 

bunu beklediğiniz orada 'basit bir komut olarak basit olurdu olarak:

$ curl localhost:9200/_types 

veya

$ curl localhost:9200/index_name/_types 

Sunduğunuz her türlü yardım için teşekkür ederiz. Yalnızca haritalama türlerinin isimlerini istedikleri için 'don,

curl -XGET localhost:9200/_all/_mapping 

Şimdi:

+3

ES'de '_type' yoktur Eğer sadece türlerle ilgileniyorsanız, o zaman @Andrew White'ın [burada] (http://stackoverflow.com/questions/31087204/get-all-index-and-types-names-from-cluster-in -elasticsearch) Bu – ChintanShah25

cevap

20

Ne "tip" dediğimiz kullandığınızda bile "haritalama tip" ve onları almak için bir yol aslında olmasıdır size Python sadece kullanım kullanabilirsiniz olarak t şey yüklemek gerek sadece almak ne önceki tepkinin dışarı istiyorum:

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

Python komut tüm indeksleri ve haritalama üzerinde dolaşır, yani çok basit bir şey yapar türleri ve sadece ikincisinin isimlerini alır:

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

GÜNCELLEME Ruby'yi kullandığınız için, aynı hüner Ruby kodunu kullanarak kullanılabilir

:

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

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

Yakut script şöyle

+1

için teşekkürler [install jq] (https://stedolan.github.io/jq/download/). Belgeleri (ve diğer web kaynaklarını) okuduğum sırada, eşlemelerin tür düzeyinde değil, alan/öznitelik düzeyinde olduğu izlenimini edindim. _mapping komutu kesinlikle aradığım şeyi verir ama Ruby'yi değil Python'u kullanıyorum, bu yüzden Ruby'deki sonuçları nasıl ayrıştıracağımı bulmak zorundayım. Şu anda, yalnızca farklı sorgu permütasyonlarını deneyerek olabildiğince API'yi anlamaya çalışıyorum. Her zaman olduğu gibi, yardım için teşekkür ederim. - Thx –

+0

Cevabımı, eşdeğer bir Ruby koduyla güncelledim. – 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; 
} 
İlgili konular