You need to enable JavaScript to run this app. spring-data-elasticsearch中NativeSearchQueryBuilder的withIds过滤ID失效问题
优惠活动
大模型
产品
解决方案
定价
更多

spring-data-elasticsearch中NativeSearchQueryBuilder的withIds过滤ID失效问题

问题原因

Spring Data Elasticsearch 4.2.x版本中,NativeSearchQueryBuilder的withIds方法的设计仅用于multiGet等直接按ID查询的API传参,不会自动将配置的ID列表生成DSL中的ids查询子句,所以调用search接口的时候,这部分配置不会被拼接到查询语句中,自然不会生效。

解决方法

有两种可行方案:

  • 方案一:手动在查询条件中添加ids查询子句,适配search接口的使用场景
import org.elasticsearch.index.query.QueryBuilders;

// 构建查询的代码调整如下
NativeSearchQuery query = new NativeSearchQueryBuilder()
    .withQuery(QueryBuilders.idsQuery().addIds(ids.toArray(new String[0])))
    .withSourceFilter(new FetchSourceFilterBuilder().withIncludes("bi", "li").build())
    .withPageable(pageable)
    .build();
SearchHits<Foo> searchHits = esRestTemplate.search(query, Foo.class);
  • 方案二:如果不需要额外的查询条件、分页、字段过滤以外的逻辑,直接使用multiGet接口查询,性能更高
List<Foo> results = esRestTemplate.multiGet(Query.builder().withIds(ids).build(), Foo.class);

如果后续升级到Spring Data Elasticsearch 4.3及以上版本,withIds方法已经做了适配,会自动将ID列表添加到search接口的查询条件中,无需额外手动编写idsQuery。

内容的提问来源于stack exchange,提问作者Rpj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 21:06:03