查询和 return 仅具有 spring 数据的特定嵌套字段 elasticsearch

Query and return only specific nested field with spring data elasticsearch

是否可以使用 spring 数据 elasticsearch return 我所有 elastisearch 文档的特定嵌套字段?

例如es 数据存储库将如何查找以下查询?

URL: /myIndex/MyType/_search

查询正文:

{
  "_source": [
    "MyNestedObj.myField"
  ]
}

适用于 Spring Elasticsearch Data >= version 2.0

不幸的是,版本 1.x

无法使用源过滤
import org.elasticsearch.index.query.MatchAllQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.query.FetchSourceFilter;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.data.elasticsearch.core.query.SourceFilter;
import org.springframework.stereotype.Repository;
import java.util.ArrayList;
import java.util.List;

@Repository
public class MyRepository {

    private final static String FIELD_MYFIELD = "MyNestedObj.myField";

    @Autowired
    private ElasticsearchTemplate elasticsearchTemplate;

    public List<String> findAll() {
        SourceFilter sourceFilter = new FetchSourceFilter(new String[]{FIELD_MYFIELD}, null);
        final PageRequest pageRequest = new PageRequest(0, Integer.MAX_VALUE, new Sort(FIELD_MYFIELD));

        final NativeSearchQuery query = new NativeSearchQueryBuilder()//
                .withQuery(new MatchAllQueryBuilder()).withSourceFilter(sourceFilter)//
                .withIndices("myIndex").withTypes("MyType").withPageable(pageRequest)//
                .build();

        return this.elasticsearchTemplate.query(query, response -> {
            List<String> values = new ArrayList<>();
            final SearchHits hits = response.getHits();
            for (final SearchHit hit : hits) {
                values .add(hit.getSource().get(FIELD_MYFIELD));
            }
            return values;
        });
    }
}