在Elastic REST API中,_update_by_query和_delete_by_query操作非常相似:它们都接受查询,它们具有相似的属性和相似的行为。
然而,spring-data-elasticsearch中的实现与此完全不同:
spring-data-elasticsearch上的_update_by_query由org.springframework.data.elasticsearch.core.query.UpdateQuery建模
例如:
final BoolQueryBuilder boolQuery = QueryBuilders.boolQuery()
.filter(QueryBuilders.rangeQuery(STATUS_SEARCH_FIELD).lt(EsMessage.STATUS))
final NativeSearchQuery nsq = new NativeSearchQuery(boolQuery);
final UpdateQuery updateQuery = UpdateQuery.builder(nsq)
.withScriptType(ScriptType.INLINE)
.withScript(UPDATE_SCRIPT)
.withParams(UPDATE_PARAMS)
.build();
final ByQueryResponse response = esRestTemplate.updateByQuery(
updateQuery, IndexCoordinates.of(INDEX_ALIAS)
);
现在on _delete_by_query一切都不同了(!!)
没有UpdateQuery对象ElasticsearchRestTemplate上没有updateByQuery方法
有什么原因吗?执行_delete_by_query操作的正确方法是什么?是我做错了什么还是意想不到的?
1条答案
按热度按时间v8wbuo2f1#
下面是我在Github issue上写的内容:
没有UpdateQuery对象
为什么删除请求中应该有一个
UpdateQuery
对象?为了通过查询删除,我们只需要一个查询和要使用的索引,ElasticsearchOperations
有这些方法:当使用
CriteriaQuery
时,需要第二种方法来进行正确的字段名称Map。对于更新,需要的信息远远不止查询,因此有一个
UpdateQuery
对象包含Query
和此附加信息。ElasticsearchRestTemplate上没有updateByQuery方法
于2021年4月随Spring Data Elasticsearch版本4.2引入(该版本本身已经停止支持一年)。