Как получить вложенные типы в 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
"s ArtworkStatus
а также ArtWorkDate
ценности, пожалуйста, ведите меня, я буду очень благодарен вам.
1 ответ
Вы почти получили решение. Запрос 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.