我正在使用 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)
根据文档:
只需在下面添加您选择的库的导入,然后通过范围内的隐含内容,您现在可以将您喜欢的任何类型传递给文档,并且将自动派生可索引。
带有
import io.circe.generic.auto._
和 import com.sksamuel.elastic4s.circe._
用于弹性 4 圈。
我错过了什么?
您需要在
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)
我没有使用过 Circe,但我使用过 SprayJson,也许我的回答可以帮助未来查看这个问题的人:
对于 Spray,我首先天真地认为
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的
import io.circe.generic.auto._
中实现的,但也许它不适用于elastic4s,你必须手动编写它。