java - 使用它的客户端 API 解析深度嵌套的 elasticsearch 聚合

标签 java scala elasticsearch

我正在使用 Java 客户端 API 取回聚合。以下是我正在处理的结构。

aggregations
top_models
   buckets
       key : "BMW"
      doc_count : 3
      top_models
           buckets
               key : "X5"
               doc_count : 2
              top_hits
                   source
                      model : X5
                      color : Red
                  source
                     model:X5
                    color : White
           key : "X3"
               doc_count : 1
              top_hits
                   source
                      model : X3
                      color : Red
      key : "Mercedes"
      doc_count : 2
      top_models
           buckets
               key : "Benz"
               doc_count : 1
               top_hits
                   source
                      model : Benz
                      color : Red

              key : "ML"
              doc_count : 1
              top_hits
                   source
                      model : ML
                      color : Black

我正在尝试按照(玩具)代码检索所有结果。

def getAggregations(aggres: Option[Aggregations]): Option[Iterable[Any]] = {


aggres map { agg =>


  val aggS = agg.asMap().asScala


  aggS map {


    case (name, termAgg: Terms) => getBuckets(Option(termAgg.getBuckets()))


    case (name, topHits: TopHits) =>


      val tHits = Option(topHits.getHits())


      tHits map { th => getTopHits(th.asScala)
    }


    case (h, a: InternalAvg) => println(h + "=>" + a.getValue());


  }





}


}





def getBuckets(buckets: Option[java.util.Collection[Bucket]]) = {


buckets map { bks =>


  val bksS = bks.asScala


  bksS map { b =>


    println("Bucket Key =>" + b.getKey())


    println("Doc count =>" + b.getDocCount())


    getAggregations(Option(b.getAggregations())


  }


  }

 }

需要将最终结果填充到这个类中

case class FinalResponse(bucketName: String, count: Long, children: List[FinalResponse])

由于聚合和存储桶之间存在嵌套关系,检索所有聚合结果变得很复杂。你如何处理这个问题?

最佳答案

在我之前的项目中,我们使用这种方式从 Elasticsearch 中反序列化复杂对象:

Elastic search 允许您获得结果集中每个元素的纯 json View (作为字符串)。比起我们简单地使用带有 scala 模块的 Jacson json 库并制作类似 pojo 的类来反序列化数据。

Elastic search java api 是可怕的多层嵌套映射集。忘了那个吧。

val hits = qb.execute().actionGet().getHits().getHits().asScala
hits.map { hit =>
  (hit.getId, hit.getSourceAsString, hit.getVersion)
}

对于聚合,它也应该可用

关于java - 使用它的客户端 API 解析深度嵌套的 elasticsearch 聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25041143/

相关文章:

java - 如何在aspectj中将一个aspect方法与多个方法相关联?

java - log4j 自定义记录器方法没有被调用

Scala Nothing 数据类型

java - META-INF/versions/9/* 和带有 Jetty 9.2 的 Elasticsearch 6.2.2+ 上的字节码扫描错误

python - 在 python 请求中使用转义引号查询 Elasticsearch

php - Elastic Search 中如何应用过滤器?

java - 在 for 循环内声明变量以及 print 语句时出错

java - 如何在Eclipse中添加开源代码文件,以便 `Ctrl+Shift+R`显示源代码文件?

scala - 按类型过滤 Scala 列表

javascript - Js Deferred/Promise/Future 与 Scala 等函数式语言相比