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();
}