We're trying to migrate our Opensearch cluster to Elasticsearch.
We've been using Spring Data Elasticsearch with OpenSearch and using fields option to retrieve selected fields. (BaseQueryBuilder#withFields along with BaseQueryBuilder#withSourceFilter)
Sample code:
NativeSearchQueryBuilder queryBuilder =
new NativeSearchQueryBuilder().withQuery(query)
.withFields("someId")
.withSourceFilter(new FetchSourceFilter(new String[] {}, new String[] {"*"}));
This was working with Spring Data 4.2.X and Opensearch 1.2.4.
However, with Spring Data 4.4.X and Elasticsearch 8.3, SearchHit's content field does not contain given fields.
What I want to achieve is similar to this query:
GET some_index/_search
{
"query": {
"match_all": {}
},
"fields": [
"someId"
],
"_source": false
}
Tried attempts:
1.
NativeSearchQueryBuilder queryBuilder =
new NativeSearchQueryBuilder().withQuery(query)
.withFields("someId");
No luck, it's as if this parameter is ignored, returns all the fields in documents.
2.
NativeSearchQueryBuilder queryBuilder =
new NativeSearchQueryBuilder().withQuery(query)
.withSourceFilter(new FetchSourceFilter(new String[] {"someId"}, null))
It works. However, in official ES documentation, it states that:
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.
So is it worse that using source filtering instead of fields option performance wise?
Is it possible to achieve disabling source and getting selected fields by fields option with Spring Data Elasticsearch?
If it's not possible we consider to use SearchSourceBuilder instead of Spring Data's NativeSearchQueryBuilder.
