java - 如何在elasticsearch中检索嵌套文档和数组值

标签 java json scala elasticsearch

我有以下文档

{
  "_index" : "Testdb",
  "_type" : "artWork",
  "_id" : "0",
  "_version" : 1,
  "found" : true,
  "_source":{"uuid":0,"ArtShare":{"TotalArtShares":0,"pricePerShare":0,"ArtworkUuid":12,"AvailableShares":0,"SoldShares":0},"StatusHistoryList":[{"ArtWorkDate":"2015-08-26T13:20:17.725+05:00","ArtworkStatus":"ACTIVE"}]}
}

我想访问/检索ArtShare的值及其属性和数组StatusHistoryList的值

我就是这样做的

val get=client.prepareGet("Testdb","artWork",Id.toString())
        .setOperationThreaded(false)
        .setFields("uuid","ArtShare","StatusHistoryList"
            )
        .execute()
        .actionGet()
        if(get.isExists())
        {
        uuid=get.getField("uuid").getValue.toString().toInt
       //how to fetch `artShare` whole nested document and array elements `StatusHistoryListof`  
     }

更新 如果我这样做

 val get=client.prepareGet("Testdb","artWork",Id.toString())
            .setOperationThreaded(false)
            .setFields("uuid","ArtShare","StatusHistoryList"
                ,"_source","ArtShare.TotalArtShares")
            .execute()
            .actionGet()
            if(get.isExists())
            {
            uuid=get.getField("uuid").getValue.toString().toInt
           var totalShares= get.getField("ArtShare.TotalArtShares").getValue.toString().toInt 
         }

然后抛出以下异常

org.elasticsearch.ElasticsearchIllegalArgumentException: field [ArtShare] isn't a leaf field
    at org.elasticsearch.index.get.ShardGetService.innerGetLoadFromStoredFields(ShardGetService.java:368)
    at org.elasticsearch.index.get.ShardGetService.innerGet(ShardGetService.java:210)
    at org.elasticsearch.index.get.ShardGetService.get(ShardGetService.java:104)
    at org.elasticsearch.action.get.TransportGetAction.shardOperation(TransportGetAction.java:104)
    at org.elasticsearch.action.get.TransportGetAction.shardOperation(TransportGetAction.java:44)
    at org.elasticsearch.action.support.single.shard.TransportShardSingleOperationAction$ShardTransportHandler.messageReceived(TransportShardSingleOperationAction.java:297)
    at org.elasticsearch.action.support.single.shard.TransportShardSingleOperationAction$ShardTransportHandler.messageReceived(TransportShardSingleOperationAction.java:280)
    at org.elasticsearch.transport.netty.MessageChannelHandler$RequestHandler.doRun(MessageChannelHandler.java:279)
    at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:36)

请指导我如何获取这些值

最佳答案

是的,实际上问题是您在字段数组中提到了“ArtShare”和“ArtShare.TotalArtShares”。因此它会抛出异常,因为您已经检索了完整的 ArtShare 对象。

所以请提及您想要的字段,如果您想要指定的嵌套值,则无需访问完整的父对象。

试试这个:

val get=client.prepareGet("Testdb","artWork",Id.toString())
        .setOperationThreaded(false)
        .setFields("uuid","StatusHistoryList",
            "ArtShare.TotalArtShares")
        .execute()
        .actionGet()
        if(get.isExists())
        {
        uuid=get.getField("uuid").getValue.toString().toInt
       var totalShares= get.getField("ArtShare.TotalArtShares" 
     }

如果您想要完整的“ArtShare”对象,只需编写:

val get=client.prepareGet("Testdb","artWork",Id.toString())
    .setOperationThreaded(false)
    .setFields("uuid","ArtShare","StatusHistoryList"
        )
    .execute()
    .actionGet()
    if(get.isExists())
    {
    uuid=get.getField("uuid").getValue.toString().toInt
   //how to fetch `artShare` whole nested document and array elements `StatusHistoryListof`  
 }

关于java - 如何在elasticsearch中检索嵌套文档和数组值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32222380/

相关文章:

scala - Akka HTTP 中的编码

java - 添加 equals() 和 hashCode() 方法会破坏某些东西吗

Javascript - 使用下拉菜单来定位对象属性在首次使用后中断

scala - 重命名并覆盖案例类中的 equals 方法

python - 将列表表示为带有双引号的字符串,而不是 JSON 的单引号

iOS编程,获取JSON数据

scala - 如何安装旧版本的scala

java - 在创建 fragment 之前调用 fragment 内的方法,抛出 NPE。我应该如何处理这个问题?

java - @scope - spring - 使用注释设置范围 "prototype",行为类似于单例。我哪里出错了?

java - 缓冲文件读取器的问题