由另一个 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并付诸实践
我有一个 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并付诸实践