Java 使用它解析深度嵌套的elasticsearch聚合';s客户端API
我正在使用Java客户端API恢复聚合。以下是我正在处理的结构Java 使用它解析深度嵌套的elasticsearch聚合';s客户端API,java,scala,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
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])
由于聚合和bucket之间的嵌套关系,检索所有聚合结果变得非常复杂。您是如何实现这一点的?在我之前的项目中,我们使用这种方式从弹性搜索中理想化复杂对象: 弹性搜索允许您获得结果集每个元素的纯json视图(作为字符串)。然后,我们将Jacson json库与scala模块一起使用,并创建类似pojo的类来反序列化数据 弹性搜索JavaAPI是一组可怕的嵌套映射。算了吧
val hits = qb.execute().actionGet().getHits().getHits().asScala
hits.map { hit =>
(hit.getId, hit.getSourceAsString, hit.getVersion)
}
对于agregations,它也应该是可用的