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
相关产品推荐
相关产品推荐

