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.
疑问
- 使用源过滤替代
fields选项是否会导致性能下降? - 能否通过Spring Data Elasticsearch实现禁用
_source并通过fields选项获取指定字段?若无法实现,我们考虑改用SearchSourceBuilder替代NativeSearchQueryBuilder。
内容的提问来源于stack exchange,提问作者khonsu
相关产品推荐
相关产品推荐

