簡體   English   中英

如何在Elasticsearch中獲取嵌套類型

[英]How to get nested types in 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

請幫助我如何獲取StatusHistoryListArtworkStatusArtWorkDate值,請指導我,我將非常感謝您。

您幾乎已經得出了解決方案。 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")它將返回List get.getSource.get("StatusHistoryList")對象,而不是Map。 這就是classCastException異常的原因。

因此,如果將響應轉換為對象列表,則將解決問題。

但這不是理想的解決方案。 一些庫(例如Jackson-Faterxml)可以為您完成這項工作。 使用fasterxml庫,您可以將json綁定到等效的POJO對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM