2015-08-28 92 views
1

我有以下文件:如何获得嵌套类型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() 

后来我从代码空值,但我的文档中包含的值,然后我发现这个question 所以从那以后,我试图做这样的

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值的ArtworkStatusArtWorkDate值请引导我我会非常感谢你。

回答

0

您几乎可以推导出解决方案。 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")返回列表艺术品的对象,而不是一个地图文件。这是classCastException例外的原因。

因此,如果您将响应转换为对象列表,您的问题将得到解决。

但这不是一个理想的解决方案。一些像Jackson-Faterxml这样的图书馆可以帮你完成这项工作。使用fasterxml库可以将json绑定到等效的POJO对象。

相关问题