无法为包含具有自定义键类型的 Map 的类型生成可索引

问题描述 投票:0回答:2

我正在使用 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 圈。

我错过了什么?

scala elasticsearch elastic4s circe
2个回答
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)

0
投票

我没有使用过 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,你必须手动编写它。

© www.soinside.com 2019 - 2024. All rights reserved.