Java-клиент высокого уровня для эластичного поиска. Требуется справка по API UpdateByQueryRequest.

Я перехожу с обычных вызовов 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 ответ

Решение

Я действительно нашел ответ на этот вопрос... Нам просто нужно добавить имя индекса в конструктор. Это окончательный ответ на вопрос, надеюсь, он будет кому-то полезен в будущем:)

    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();
    }
Другие вопросы по тегам