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

Spring Data Elasticsearch迁移后fields选项无法获取指定字段求助

问题:Spring Data Elasticsearch迁移后fields选项失效问题

背景

我们正将OpenSearch集群迁移至Elasticsearch。此前在Spring Data Elasticsearch结合OpenSearch的场景中,使用fields选项(BaseQueryBuilder#withFields搭配BaseQueryBuilder#withSourceFilter)来获取指定字段,示例代码如下:

NativeSearchQueryBuilder queryBuilder =
    new NativeSearchQueryBuilder().withQuery(query)
                                  .withFields("someId")
                                  .withSourceFilter(new FetchSourceFilter(new String[] {}, new String[] {"*"}));

该代码在Spring Data 4.2.X与OpenSearch 1.2.4环境下可正常运行,但在Spring Data 4.4.X与Elasticsearch 8.3环境中,SearchHit的content字段未包含指定字段。

期望实现的查询效果

等效于以下Elasticsearch原生查询:

GET some_index/_search
{
  "query": {
    "match_all": {}
  },
  "fields": [
    "someId"
  ],
  "_source": false
}

已尝试的方案

  • 方案1:仅使用withFields
NativeSearchQueryBuilder queryBuilder =
    new NativeSearchQueryBuilder().withQuery(query)
                                  .withFields("someId");

无效,参数被忽略,返回文档所有字段。

  • 方案2:使用源过滤
NativeSearchQueryBuilder queryBuilder =
    new NativeSearchQueryBuilder().withQuery(query)
                                  .withSourceFilter(new FetchSourceFilter(new String[] {"someId"}, null))

该方案有效,但Elasticsearch官方文档指出:

Using fields is typically better
These options are usually not required. Using the fields option is typically the better choice, unless you absolutely need to force loading a stored or docvalue_fields.

疑问

  1. 使用源过滤替代fields选项是否会导致性能下降?
  2. 能否通过Spring Data Elasticsearch实现禁用_source并通过fields选项获取指定字段?若无法实现,我们考虑改用SearchSourceBuilder替代NativeSearchQueryBuilder。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 23:00:54