All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jp.co.bizreach.elasticsearch4s.ESUtils.scala Maven / Gradle / Ivy

There is a newer version: 4.0.0
Show newest version
package jp.co.bizreach.elasticsearch4s

import scala.reflect.ClassTag

object ESUtils {

  def getDocumentMap(hit: Map[String, Any]): Map[String, Any] = {
    hit.get("_source").map(_.asInstanceOf[Map[String, Any]])
      .getOrElse(structuredMap(hit("fields").asInstanceOf[Map[String, Any]]))
  }

  def structuredMap(map: Map[String, Any]): Map[String, Any] = {
    def structuredMap0(group: List[(List[String], Any)]): Any = {
      group.groupBy { case (key, value) => key.head }.map { case (key, value) =>
        key -> (if(value.head._1.length == 1){
          value.head._2
        } else {
          structuredMap0(value.map { case (key, value) => key.tail -> value })
        })
      }
    }

    val list = map.map { case (key, value) => key.split("\\.").toList -> value }.toList
    structuredMap0(list).asInstanceOf[Map[String, Any]]
  }

  def createESSearchResult[T](x: Map[String, Any])(implicit c: ClassTag[T]): ESSearchResult[T] = {
    val total = x("hits").asInstanceOf[Map[String, Any]]("total").asInstanceOf[Int]
    val took  = x("took").asInstanceOf[Int]
    val hits  = x("hits").asInstanceOf[Map[String, Any]]("hits").asInstanceOf[Seq[Map[String, Any]]]

    ESSearchResult(
      total,
      took,
      hits.map { hit =>
        ESSearchResultItem(
          hit("_id").asInstanceOf[String],
          hit("_score").asInstanceOf[Double],
          JsonUtils.deserialize[T](JsonUtils.serialize(getDocumentMap(hit))),
          hit.get("highlight").asInstanceOf[Option[Map[String, List[String]]]].getOrElse(Map.empty),
          hit.get("_explanation").asInstanceOf[Option[Map[String, Any]]].getOrElse(Map.empty)
        )
      }.toList,
      x.get("facets").asInstanceOf[Option[Map[String, Map[String, Any]]]].getOrElse(Map.empty),
      x.get("aggregations").asInstanceOf[Option[Map[String, Any]]].getOrElse(Map.empty),
      x
    )
  }
  
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy