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

Spring Data Elasticsearch @Query结合投影获取指定字段问题

解决仅返回指定字段的方案

针对你的需求,以下两种方案均无需编程式查询,仅通过@Query注解结合对应配置即可实现:

1. 在@Query中直接指定返回字段

你提到_source过时,但在Spring Data Elasticsearch的@Query场景下,依然可以通过在查询JSON根节点添加_source参数指定要返回的字段,语法如下:

interface BookRepository extends ElasticsearchRepository<Book, String> {
    @Query("""
        {
          "_source": ["author"],
          "bool":{
            "must":[
              {
                "term":{
                  "name": "#{#name}"
                }
              }
            ]
          }
        }
        """)
    Page<Book> findByName(String name, Pageable pageable);
}

执行后返回的Book实体仅会填充author字段,其余字段为null。

2. 正确使用基于接口的投影

你之前尝试投影无效果,大概率是用法有误,正确步骤如下:

步骤1:定义投影接口

创建仅包含目标字段getter方法的接口:

interface AuthorProjection {
    String getAuthor();
}

步骤2:修改Repository方法返回类型

将Repository方法的返回值改为Page<AuthorProjection>,保留原@Query注解即可:

interface BookRepository extends ElasticsearchRepository<Book, String> {
    @Query("""
        {
          "bool":{
            "must":[
              {
                "term":{
                  "name": "#{#name}"
                }
              }
            ]
          }
        }
        """)
    Page<AuthorProjection> findByName(String name, Pageable pageable);
}

Spring Data Elasticsearch会自动将查询结果映射到投影接口实例中,仅返回author字段的值。

补充说明

  • @SourceFilter注解仅适配ElasticsearchOperations的编程式查询,在Repository的@Query场景下确实不生效,无需尝试。
  • 若使用Elasticsearch 7.x+版本,_source仍是有效的查询参数,并未完全废弃,只是存在更灵活的替代方案,但在Spring Data Elasticsearch的@Query中可正常使用。

内容的提问来源于stack exchange,提问作者Martijn Jan Jaap de Bruin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 23:14:55