You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SpringBoot Elasticsearch Repository的@Query中实现terms查询

在Spring Boot Elasticsearch Repository中实现terms查询(name in ["abc","ghi"])

我需要实现类似name in ["abc","ghi"]的Elasticsearch terms查询,但官方提供的列表查询示例只针对id字段,不符合我的需求。

我尝试了三种自定义@Query的写法,都没达到预期效果:

// 第一种写法:传入拼接后的字符串
@Query("{ \"terms\": {\"name\": [\"?0\"] } }")  
Flux<Response> findByNames(String names);

// 第二种写法:模仿官方id查询的格式
@Query("{\"names\": {\"values\": ?0 }}")  
Flux<Response> findByNames(List<String> names);

// 第三种写法:直接传入列表
@Query("{ \"terms\": {\"name\": ?0 } }")
Flux<Response> findByNames(List<String> names);

第一种写法中,我把列表用nameList.stream().collect(Collectors.joining(","))拼成字符串传入,生成的查询JSON有问题:

{ "terms": {"name": ["abc,ghi"] } }

我需要的正确格式应该是:

{ "terms": {"name": ["abc","ghi"] } }

正确的解决方案

方案1:使用派生查询方法(推荐)

Spring Data Elasticsearch支持通过方法名自动生成查询,直接定义如下方法即可,框架会自动转换为正确的terms查询:

Flux<Response> findByNameIn(List<String> names);

方案2:正确使用@Query注解

如果必须自定义查询语句,直接传入List<String>类型的参数,Spring会自动将列表解析为Elasticsearch的数组格式,无需手动拼接:

@Query("{\"terms\": {\"name\": ?0}}")
Flux<Response> findByNames(List<String> names);

注意事项

  • 确保实体类中name字段的名称和Elasticsearch索引中的字段完全一致(包括大小写、是否嵌套等);
  • 若使用较新版本的Spring Data Elasticsearch,派生查询的In关键字已经完全支持terms查询,无需手动写@Query。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 07:24:22