![](/img/trans.png)
[英]How to map the resultset of elasticsearch query with Java High Level Rest Client API?
[英]Elasticsearch High Level Rest Client - java Map with typed (sub) fields - dates, numbers etc
(从评论中复制的澄清)
我有一个java.util.Map
,它有不同的键值对,一些值是日期,一些数字,一些是字符串,还有一些也是java.util.Map
,它们也可以包含各种上述类型。 我能够将它放入索引中,我看到弹性搜索映射是使用正确的字段类型自动创建的,现在我想要检索该Map
并查看日期,数字,字符串和嵌套Map
而不是我现在拥有的 - 只是字符串和地图
更多故事:
我正在使用以下代码在Elasticsearch中放置一个java.util.Map
:
public void putMap(String key, Map<String, ?> value) {
try {
IndexRequest ir = Requests.indexRequest(_index)
.id(key)
.type("doc")
.source(value);
Factory.DB.index(ir); // the high level rest client here
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
我无法根据我的任务明确创建映射。
对于我的一个索引,它创建了这样的映射,这很好:
{
"rex": {
"mappings": {
"doc": {
"properties": {
"variables": {
"properties": {
"customer": {
"properties": {
"accounts": {
"properties": {
"dateOpen": {
"type": "date"
},
"id": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
},
"dateOfBirth": {
"type": "date"
},
"firstName": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"id": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"lastName": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"middleName": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
}
}
}
}
}
}
现在我用以下代码检索我的结构,
public Map<String, ?> getMap(String key) {
try {
GetRequest gr = new GetRequest(_index, "doc", key);
try {
GetResponse response = Factory.DB.get(gr);
if (!response.isExists()) {
return null;
}
Map<String, ?> ret = response.getSourceAsMap();
return ret;
} catch (ElasticsearchStatusException ee) {
if (ee.status().getStatus() == RestStatus.NOT_FOUND.getStatus()) {
return null;
} else {
throw new RuntimeException(ee);
}
}
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
日期以字符串形式返回,如“1957-04-29T00:00:00.000Z”
没有用于映射此文档的Java对象,因为我只有地图/列表/值的地图。
如何使Java Rest Client尊重Elasticsearch为索引创建的映射? response.getFields()
返回空映射。
如果不可能(比如'source is json / strings by design'等),我准备以最方便的形式检索映射,并自己遍历结果。 检索弹性搜索映射的代码将不胜感激。
非常感谢!
如果您仍想获取类型映射并手动执行转换,则Indices API具有可以使用Java低级REST客户端调用的Get Mapping命令。
String getMapping(RestHighLevelClient client, String index, String type) throws IOException {
String endpoint = index + "/_mapping/" + type;
Response response = client.getLowLevelClient().performRequest("GET", endpoint);
return EntityUtils.toString(response.getEntity());
}
但实际上我建议使用像Jackson这样的东西进行数据绑定。 将您从Elasticsearch获取的Map
绑定到对文档建模的Java对象,让Jackson为您处理类型转换。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.