0

いくつかのドキュメント フィールドを更新し、更新後に完全なドキュメントを返そうとしています。私は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")
}

なぜ私NullPointerExceptionは列に並ぶのres.getGetResult.sourceAsString()ですか?更新操作後の更新応答にドキュメントが含まれていないようです。_source更新応答からドキュメントを返すことはできますか?

4

1 に答える 1

0

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メソッドを介してこれをサポートします。

于 2015-07-23T11:15:54.553 に答える