我使用以下代码片段对Elasticsearch进行了查询:
$ua = LWP::UserAgent->new;
$server_endpoint = 'http://localhost:9200/index/type/_mapping?pretty=true';
$resp = $ua->get( $server_endpoint );
$myResults = $resp->content();
$decoded = JSON::XS::decode_json( $myResults );
这是请求打印的内容(如果我在解码之前打印出$ myResults;如果你只是在浏览器中输入它也可以工作):
{"index" : {
"mappings" : {
"type" : {
"properties" : {
"@timestamp" : {
"type" : "date",
"format" : "dateOptionalTime"
},
"@version" : {
"type" : "string"
},
"FIELD1" : {
"type" : "long"
},
"FIELD2" : {
"type" : "double"
},
"FIELD3" : {
"type" : "string"
},
"FIELD4" : {
"type" : "string"
},
"FIELD5" : {
"type" : "double"
},
...
"FIELDN" : {
"type" : "string"
}
}
}
}}}
我在这里要做的是访问字段的名称。我可以通过这样的方式得到存储在其中的内容的名称:
print "$decoded->{ \"index\" }{ \"mappings\" }{ \"type\" }{ \"properties\" }{ \"FIELD1\" }{ \"type\" }";
但到目前为止我无法打印出“FIELD1”。我已经尝试打印出除了之类的所有类型,但它只显示HASH(0x7ff60b345978)。
非常感谢任何帮助!
由于
答案 0 :(得分:2)
$decoded->{index}{mappings}{type}{properties}
是对属性哈希的引用。您需要该哈希的密钥,因此您使用keys
。
my @property_names = keys(%{ $decoded->{index}{mappings}{type}{properties} });
答案 1 :(得分:1)
通过摆脱您想要打印的不必要的双引号,简化您正在做的事情。
这样做:
print $decoded->{ "index" }{ "mappings" }{ "type" }{ "properties" }{ "FIELD1" }{ "type" };
或让Perl自动将哈希键中的单个单词转换为字符串:
print $decoded->{ index }{ mappings }{ type }{ properties }{ FIELD1 }{ type };