Como consultar e listar todos os tipos dentro de um índice elasticsearch?
problema: Qual é a maneira mais correta de simplesmente consultar e listar todos os tipos dentro de um índice específico (e todos os índices) na elasticsearch?
Estive a ler as referências e a API, mas não encontrei nada óbvio.posso listar índices com o comando:
$ curl 'localhost:9200/_cat/indices?v'
consigo estatísticas (que não parecem incluir tipos) com o comando:
$ curl localhost:9200/_stats
Eu esperava que houvesse um comando simples. como:
$ curl localhost:9200/_types
ou
$ curl localhost:9200/index_name/_types
Obrigado por qualquer ajuda que possa oferecer.
2 answers
O que você chama de "tipo" é na verdade um "tipo de mapeamento" e a maneira de obtê-los é simplesmente usando:
curl -XGET localhost:9200/_all/_mapping
Uma vez que só quer os nomes dos tipos de mapeamento, não precisa de instalar nada, dado que pode usar simplesmente o Python para obter apenas o que deseja da resposta anterior:
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);'
O script de Python faz algo muito simples, ou seja, itera em todos os índices e tipos de mapeamento e só recupera o último nomes:
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);'
Actualizar
Já que estás a usar o Ruby, o mesmo truque está disponível usando o código 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} }"
O guião de Ruby parece-se com isto:
require 'rubygems';
require 'json';
resp = JSON.parse(STDIN.read);
resp.each { |index, indexSpec |
indexSpec['mappings'].each { |type, fields|
puts type
}
}
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;
}