Как вернуть документ из asticsearch после обновления?
Я пытаюсь обновить несколько полей документа и вернуть полный документ после обновления. Я использую astic4s 1.3.4, asticsearch 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")
}
Почему я получаю NullPointerException
в соответствии res.getGetResult.sourceAsString()
? Кажется, что ответ об обновлении не содержит документ после операции обновления. Можно ли вернуть документ _source
из обновления ответа?
1 ответ
Elastic4s, кажется, не имеет API в UpdateDefinition (на данный момент 23.07.2015) для установки полей. Несмотря на то, что сборщик поддерживает эту операцию, приведенный ниже код похож на грязный хак, но он работает как исключение, просто установите поля непосредственно в _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
методы.