Как получить вложенные типы в 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.

Другие вопросы по тегам