由另一个 class 组成的 Elasticsearch 索引数组

Elasticsearch index array of made up of another class

我有一个 class,我想使用 Scala 客户端 elastic4s 开始将其索引到 ElasticSearch 中。我扩展了 DocumentMap 以允许我插入文档。 String、Int 等简单值正在工作,但我似乎无法获得另一个 class 的列表以正确映射。

文档看起来类似于:

case class AThing(UserName: String, Comment: String, Time: String) 
extends  DocumentMap { 
  override def map: Map[String, Any] = Map(
   "UserName" -> UserName,
   "Comment" -> Comment,
   "Time" -> Time
  )
}

case class ThingsThatHappened(Id: String, Things: Seq[AThing] = Nil) 
extends DocumentMap {
  override def map: Map[String, Any] = Map(
    "Id" -> Id,
    "Things" ->  Things
  )
}

它将在 elasticsearch 中很好地映射 Id 字段,但是当文档被插入到 elasticsearch 中时,我得到一个看起来与此类似的错误值:

List(AThing(id_for_the_thing,user_name_a,typed_in_comment,2015-03-12))

显然这是错误的,我希望在将其插入到 elasticsearch 中后与此 JSON 结构类似,例如:

"events" : [
   {
     "UserName" :"user_name_a", 
     "Comment": "typed_in_comment", 
     "Time": "2015-03-12"
   }
]

有人知道在使用 elastic4s 索引数据时映射复杂类型数组的方法吗?

首先你需要在elastic4s中创建索引。我假设你这样做了。

 client.execute {
  create index "myIndex" mappings (
    "AThings" as(
      "UserName" typed StringType,
      "Comemnt" typed StringType,
      "Time" typed StringType,
      )
    )
}

如果你创建了这个索引,那么你可以直接把case class放到这个里面。

val aThings = AThings("username","comment","time")
client.execute {index into "myIndex/AThings" doc aThings}

Elastic4s 或 java 客户端(当前)不够智能,无法判断您有嵌套序列或数组,但如果它是嵌套 java 映射(从 Scala 的角度来看仍然有点垃圾。

我认为最好的办法是使用在 1.4.13

中添加的新 Indexable 类型class

所以,给定

case class AThing(UserName: String, Comment: String, Time: String) 

然后创建一个类型class并将其纳入作用域

implicit object AThingIndexable extends Indexable[AThing] {
  def json = ... create json here using Jackson or similar which will handle nested sequences properly
}

那么你应该可以做到:

client.execute { index into "myIndex/AThings" source aThing }

它不像使用 DocumentMap 那样自动,但为您提供更多控制。

查看单元测试here并付诸实践