[英]How return document from elasticsearch after update?
我正在嘗試更新幾個文檔字段,並在更新后返回完整文檔。 我用elastic4s 1.3.4, elasticsearch 1.4.3(如服務器)。
這是一個代碼:
import scala.concurrent.ExecutionContext.Implicits.global
object ElasticsearchTester extends App {
private val settings: Settings = ImmutableSettings.settingsBuilder().put("cluster.name", "clustername").build()
private val client: ElasticClient = ElasticClient.remote(settings, ("localhost", 9300))
val initial = """
|{
| "name":"jojn",
| "surname":"olol"
|}
""".stripMargin
val updateString = """
|{
| "surname":"123",
| "global": {
| "new":"fiedl"
| }
|}
""".stripMargin
import com.sksamuel.elastic4s.ElasticDsl._
val future = client.execute {
create index "my_index"
}.flatMap { r=>
client.execute {
index into "my_index/user" doc StringDocumentSource(initial)
}.flatMap { re=>
println("Ololo indexed is: " + initial)
println("Ololo indexed id: " + re.getId)
client.execute {
update id re.getId in "my_index/user" doc StringDocumentSource(updateString) docAsUpsert true params ("fields" -> "_source")
}.map{res=>
println("Ololo result is: " + res.getGetResult.sourceAsString())
}
}
}
Await.result (future, 20.seconds)
println("Ololo ok")
}
為什么我在res.getGetResult.sourceAsString()
行中得到NullPointerException
? 似乎更新響應在更新操作后不包含文檔。 是否可以從更新響應中返回文檔_source
?
Elastic4s似乎在UpdateDefinition (目前為2015年7月23日 )中沒有用於設置字段的api。 但是它的構建器支持此操作,下面的代碼就像骯臟的hack,但是它可以作為exepcted使用,只需將字段直接設置為_builder
:
val updateRequest = update id re.getId in "my_index/user" doc StringDocumentSource(updateString) docAsUpsert true
updateRequest._builder.setFields("_source")
client.execute {
updateRequest
}.map { res=>
println("Ololo result is: " + res.getGetResult.sourceAsString())
}
}
版畫
Ololo indexed id: AU66n1yiYVxOgU2h4AoG
Ololo result is: {"name":"jojn","surname":"123","global":{"new":"fiedl"}}
Ololo ok
注意
Elasticsearch 確實 支持在更新請求后返回字段。
更新
之后Elastic4s 此通過承諾支持這一UpdateDsl.includeSource
或UpdateDsl.setFields
方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.