首页 > 解决方案 > 使用不接受 Scala Map 的脚本 ElasticSearch API 进行更新

问题描述

我遇到了一个用例,我需要更新 ElasticSearch 文档中的特定字段。所以对于这个用例,我使用了Update API with a script ES doc。但是我遇到了ScriptConstructor 的问题(编译错误),它接受以下参数:--> type, langidOrCode并且params问题出在params(java.util.Map) 参数上。

我什至尝试过 Scala 到 Java 的转换器,但无法解决。

代码片段


import org.elasticsearch.action.update.UpdateRequest
import org.elasticsearch.client.RequestOptions
import org.elasticsearch.script.{Script, ScriptType}

object Testing extends App {

  val result = updateByScript("testing", "hW7BBnQBn2nWmIjS_b0C", 10.0)
  println("@@@@@@result:---> " + result)
  high_level_client.close()

  def updateByScript(index: String, id: String, count: Double) = {

    //import scala.collection.JavaConversions.mapAsJavaMap
    //import collection.JavaConverters._
    import scala.collection.JavaConverters._

    val updateRequest = new UpdateRequest(index, id)
    
    val params = Map[String, Double]("count" -> count)

    val script = new Script(ScriptType.INLINE, "painless", "ctx._source.count += params.count", mapAsJavaMap(params))
    updateRequest.script(script)

    high_level_client.update(updateRequest, RequestOptions.DEFAULT)
  }
}

标签: javascalaelasticsearch

解决方案


对于上述问题,我尝试了Script带有参数的构造idOrCode函数并解决了我的用例,但我仍然没有得到其他Script构造函数的解决方案。

使用接受idOrCode参数的构造函数的工作代码。

代码片段


import org.elasticsearch.action.update.UpdateRequest
import org.elasticsearch.client.RequestOptions
import org.elasticsearch.script.{Script, ScriptType}

object Testing extends App {

  val result = updateByScript("testing", "hW7BBnQBn2nWmIjS_b0C", 10.0)
  println("@@@@@@result:---> " + result)
  high_level_client.close()

  def updateByScript(index: String, id: String, count: Double) = {
    val updateRequest = new UpdateRequest(index, id)
    val script = new Script(s"""ctx._source.count += $count""")
    updateRequest.script(script)
    high_level_client.update(updateRequest, RequestOptions.DEFAULT)
  }
}

推荐阅读