0

我正在使用 scala 2.11.11、elastic4s 5.4.5 和 elastic4s-circe 5.4.5

import com.sksamuel.elastic4s.ElasticDsl._
import com.sksamuel.elastic4s.TcpClient
import com.sksamuel.elastic4s.circe._
import io.circe.generic.auto._

object Test {

  val client: TcpClient = ???

  case class Something(a: Map[AnotherThing, Int])
  case class AnotherThing(b: Int)

  val smth = Something(Map.empty)

  client.execute {
    indexInto("index" / "type").doc(smth)
  }

}

这不会编译:

could not find implicit value for evidence parameter of type com.sksamuel.elastic4s.Indexable[net.lizeo.bd4m.storage.Test.Something]
indexInto("index" / "type").doc(smth)

根据文档:

只需在下面为您选择的库添加导入,然后在范围内使用这些隐式,您现在可以将您喜欢的任何类型传递给 doc,并且 Indexable 将自动派生。

使用import io.circe.generic.auto._import com.sksamuel.elastic4s.circe._用于 elastic4s-circe。

我错过了什么?

4

2 回答 2

0

我没有使用过 Circe,但我使用了 SprayJson,也许我的回答可以帮助未来的人研究这个问题:

对于 Spary,我首先天真地认为这就import com.sksamuel.elastic4s.sprayjson._足够了,但是 Spray 需要一个用于自定义案例类的 JsonProtocol,如下所示:

object MyJsonProtocol extends DefaultJsonProtocol {
  implicit val smthFormat = jsonFormat1(Something)
  implicit val anotherThgFormat = jsonFormat1(AnotherThing)
}

然后在代码顶部导入两者:

import MyJsonProtocol._
import com.sksamuel.elastic4s.sprayjson._

我认为这部分 auto-magic 是在 Circe's 中实现的import io.circe.generic.auto._,但也许它不适用于 elastic4s 并且您必须手动编写它。

于 2020-06-12T14:55:42.780 回答
0

您需要定义对象case classes范围之外,Test即在Test类之外。您也可以将它们定义为单独的类。

所以正确的方法应该是

import com.sksamuel.elastic4s.ElasticDsl._
import com.sksamuel.elastic4s.TcpClient
import com.sksamuel.elastic4s.circe._
import io.circe.generic.auto._

object Test {

  val client: TcpClient = ???

  val smth = Something(Map.empty)

  client.execute {
    indexInto("index" / "type").doc(smth)
  }

}

case class Something(a: Map[AnotherThing, Int])
case class AnotherThing(b: Int)
于 2017-06-19T14:16:58.430 回答