如何在Elasticsearch中获取嵌套类型

时间:2015-08-28 11:13:17

标签: java json scala elasticsearch elasticsearch-api

我有以下文件:

{
  "_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值的值,请指导我,我将非常感谢你。

1 个答案:

答案 0 :(得分:0)

您几乎已经找到了解决方案。 GET请求已检索到响应,但问题在于解析响应。

让我们看看问题所在。以下是弹性搜索作为源返回的文档

if (auth[:user])

当我们{ "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" } ] } 时,它返回List ArtWork对象而不是Map。这就是get.getSource.get("StatusHistoryList")例外的原因。

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

但这不是一个理想的解决方案。像Jackson-Faterxml这样的一些库可以帮到你。使用fasterxml库,您可以将json绑定到等效的POJO对象。