需要Elastic Search高级Java客户端UpdateByQueryRequest API帮助

时间:2019-12-17 19:25:11

标签: java elasticsearch resthighlevelclient

我正在从普通的ES Http调用迁移到ES HighLevelJavaClient。

我要转换此旧的实现 POST / _update_by_query

 {
  "script": {
    "inline": "ctx._source.collibra_match_for = []"
  },
  "query": {
    "bool": {
      "filter": {
        "script": {
          "script": {
            "source": "doc['collibra_match_for.keyword'].values.length > 0",
            "lang": "painless"
          }
        }
      }
    }
  }
}

到高级客户端代码。

我尝试的代码是:

  UpdateByQueryRequest request = new UpdateByQueryRequest();
    request.setConflicts("proceed");
    request.setQuery(QueryBuilders.boolQuery().filter(QueryBuilders.scriptQuery(new Script("doc['collibra_match_for.keyword'].values.length > 0"))));
    request.setScript(new Script(ScriptType.INLINE, "painless","ctx._source.collibra_match_for = []",Collections.emptyMap()));
    request.setRefresh(true);
    try {
        BulkByScrollResponse bulkResponse = esClient.updateByQuery(request, RequestOptions.DEFAULT);
        long totalDocs = bulkResponse.getTotal();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

但是我遇到了这个错误:

Elasticsearch exception [type=exception, reason=Incorrect HTTP method for uri [/_update_by_query?requests_per_second=-1&ignore_unavailable=false&expand_wildcards=open&allow_no_indices=true&refresh=true&conflicts=proceed&timeout=1m] and method [POST], allowed: [DELETE, PUT, GET, HEAD]]

任何帮助将不胜感激:)

1 个答案:

答案 0 :(得分:1)

我实际上找到了这个问题的答案。 我们只需要在构造函数中添加索引名称。 这是问题的最终答案。希望以后对某人有用:)

    UpdateByQueryRequest request = new UpdateByQueryRequest(INDEX_NAME);
    request.setConflicts("proceed");
    request.setQuery(QueryBuilders.boolQuery().filter(QueryBuilders.scriptQuery(new Script("doc['collibra_match_for.keyword'].values.length > 0"))));
    request.setScript(new Script(ScriptType.INLINE, "painless","ctx._source.collibra_match_for = []",Collections.emptyMap()));
    request.setRefresh(true);
    try {
        BulkByScrollResponse bulkResponse = esClient.updateByQuery(request, RequestOptions.DEFAULT);
        long totalDocs = bulkResponse.getTotal();
    } catch (IOException e) {
        e.printStackTrace();
    }