Как вернуть документ из 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 методы.

Другие вопросы по тегам