2015-08-28 5 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 's ArtworkStatus и ArtWorkDate значения, пожалуйста, назовите меня, я буду очень благодарен вам.

ответ

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") возвращает объекты ArtWork списка, а не карта. В этом причина исключения classCastException.

Итак, если вы отбросите ответ на список объектов, ваша проблема будет решена.

Но это не будет идеальным решением. Некоторые из таких библиотек, как Jackson-Faterxml, делают эту работу за вас. Используя библиотеку fastxml, вы можете привязать json к эквивалентному объекту POJO.

Смежные вопросы