2015-07-23 2 views
0

Я пытаюсь обновить несколько полей документа и вернуть полный документ после обновления. Я использую elastic4s 1.3.4, elasticsearch 1.4.3 (как сервер).Как вернуть документ из elasticsearch после обновления?

Вот код:

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 из ответа на обновление?

ответ

0

У Elastic4s похоже нет api в UpdateDefinition (на данный момент 23.07.2015) для установки полей. Однако это строитель поддержки этой операции, код ниже, как грязный хак, но он работает как 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 делаетsupport возвращает поля после запроса на обновление.

Обновлено

Elastic4s после this обязательства по поддержке этого через UpdateDsl.includeSource или UpdateDsl.setFields методами.