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

