![](/img/trans.png)
[英]How to get nested documents by field value from other documents (ElasticSearch)?
[英]How to get nested types in Elasticsearch
我有以下文件:
{
"_index" : "testdb",
"_type" : "artWork",
"_id" : "0",
"_version" : 4,
"found" : true,
"_source":{"uuid":0,
"StatusHistoryList":[
{
"ArtWorkDate":"2015-08-28T15:52:03.030+05:00",
"ArtworkStatus":"ACTIVE"
},
{
"ArtWorkDate":"2015-08-28T15:52:03.030+05:00",
"ArtworkStatus":"INACTIVE"
}
]
}
这是文档的映射:
{
"testdb" : {
"mappings" : {
"artWork" : {
"properties" : {
"StatusHistoryList" : {
"type" : "nested",
"properties" : {
"ArtWorkDate" : {
"type" : "string",
"store" : true
},
"ArtworkStatus" : {
"type" : "string",
"store" : true
}
}
},
"uuid" : {
"type" : "integer",
"store" : true
}
}
}
}
}
}
现在,我想访问StatusHistoryList
的值。 如果这样做,我将得到空值:
val get = client.prepareGet("testdb", "artWork", Id.toString()).setOperationThreaded(false)
.setFields("uuid",,"StatusHistoryList.ArtworkStatus","StatusHistoryList.ArtWorkDate","_source")
.execute()
.actionGet()
var artworkStatusList= get.getField("StatusHistoryList.ArtworkStatus").getValues.toArray()
var artWorkDateList= get.getField("StatusHistoryList.ArtWorkDate").getValues.toArray()
然后我从代码中得到了空值,但是我的文档包含了这些值,然后我发现了这个问题,所以在此之后我尝试这样做
var smap = get.getSource.get("StatusHistoryList").asInstanceOf[Map[String,Object]]
但是然后ClassCastException
java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Map
请帮助我如何获取StatusHistoryList
的ArtworkStatus
和ArtWorkDate
值,请指导我,我将非常感谢您。
您几乎已经得出了解决方案。 GET请求已检索到响应,但问题在于解析响应。
让我们看看问题所在。 以下是弹性搜索返回的文件来源
{
"uuid":0,
"StatusHistoryList":[
{
"ArtWorkDate":"2015-08-28T15:52:03.030+05:00",
"ArtworkStatus":"ACTIVE"
},
{
"ArtWorkDate":"2015-08-28T15:52:03.030+05:00",
"ArtworkStatus":"INACTIVE"
}
]
}
当我们执行get.getSource.get("StatusHistoryList")
它将返回List get.getSource.get("StatusHistoryList")
对象,而不是Map。 这就是classCastException
异常的原因。
因此,如果将响应转换为对象列表,则将解决问题。
但这不是理想的解决方案。 一些库(例如Jackson-Faterxml)可以为您完成这项工作。 使用fasterxml库,您可以将json绑定到等效的POJO对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.