首页 > 解决方案 > 使用 Java API 根据条件更新 ElasticSearch 文档

问题描述

我有一个弹性搜索索引(让我们将其命名为学生)。我有田野

{ "name","division" ,"class" , "studentRollNo"} .

是否可以更新名称为 "ABC" 的记录的弹性搜索索引。使用 update API 我只能通过 id 更新它,使用 Update with query 如何传递 jsonString 。可以说我用于更新的 json 字符串是

现存的 :

{“姓名”:“abc”,“师”:“D”,“班级”:10,“学生卷号”:23}

更新 :

{"name":"abc" , "division" : A , "class" : 11 , "studentRollNo" : 23}

标签: javaelasticsearch

解决方案


我不确定您使用的是哪个 elasticsearch 版本,但下面是 ES 7.13 版本的代码片段。

RestHighLevelClient client = new RestHighLevelClient(
            RestClient.builder(new HttpHost("localhost", 9200, "http")));

    UpdateByQueryRequest request = new UpdateByQueryRequest("student");
    request.setQuery(new TermQueryBuilder("name", "abc"));

    // This data map you can directly create from JSON string as well.
    Map<String, Object> data = new HashMap<String, Object>();
    data.put("name", "abc");
    data.put("division", "A");
    data.put("class", 11);
    data.put("studentRollNo", 23);

    Map<String, Object> param = new HashMap<String, Object>();
    param.put("data", data);

    // script will read data param value and assign to document source
    String source = "ctx._source=params.data";
    Script script = new Script(ScriptType.INLINE, "painless", source, param);

    request.setScript(script);
    client.updateByQuery(request, RequestOptions.DEFAULT);
    client.close();

以下是查询 rest API json 的等效更新:

POST student/_update_by_query
{
  "query": {
    "term": {
      "name": {
        "value": "abc"
      }
    }
  },
  "script": {
    "source": "ctx._source=params.data",
    "params": {
      "data": {
        "name": "abc",
        "division": "A",
        "class": 11,
        "studentRollNo": 23
      }
    }
  }
}

推荐阅读