spring-data-elasticsearch上的DeleteByQuery

vc6uscn9  于 2023-05-16  发布在  ElasticSearch
关注(0)|答案(1)|浏览(209)

在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操作的正确方法是什么?是我做错了什么还是意想不到的?

v8wbuo2f

v8wbuo2f1#

下面是我在Github issue上写的内容:
没有UpdateQuery对象
为什么删除请求中应该有一个UpdateQuery对象?为了通过查询删除,我们只需要一个查询和要使用的索引,ElasticsearchOperations有这些方法:

ByQueryResponse delete(Query query, IndexCoordinates index);
ByQueryResponse delete(Query query, Class<?> clazz, IndexCoordinates index);

当使用CriteriaQuery时,需要第二种方法来进行正确的字段名称Map。
对于更新,需要的信息远远不止查询,因此有一个UpdateQuery对象包含Query和此附加信息。
ElasticsearchRestTemplate上没有updateByQuery方法

ByQueryResponse updateByQuery(UpdateQuery updateQuery, IndexCoordinates index);

于2021年4月随Spring Data Elasticsearch版本4.2引入(该版本本身已经停止支持一年)。

相关问题