小编典典

通过spring数据从elasticsearch获得一个字段

elasticsearch

我有这样的ES文档

class User {
    String name;
    String describe;
    List<String> items;
}

我正在使用Spring数据通过Repository接口与ES通讯

interface UserRepository extends Repository<User, String> {
}

现在,我需要构建一个rest接口,以像这样响应JSON格式的数据

{"name": String, "firstItem": String}

由于describeand itemsin User很大,因此从ES检索所有字段非常昂贵。

我知道ES具有名为“响应过滤”的功能,可以满足我的要求,但是我找不到在Spring Data中使用它的方法。

如何在Spring数据中执行此操作?


阅读 398

收藏
2020-06-22

共1个答案

小编典典

您需要混合使用源过滤(用于不 检索
重字段)和响应过滤(用于不 返回 重字段)。但是,Spring Data ES尚不支持后者(尚未)

对于前者,您可以利用NativeSearchQueryBuilder并指定一个FetchSourceFilter只会检索您需要的字段的。Spring
Data ES尚不支持后者。您可以做的是创建另一个名为的字段firstItem,您将在其中存储第一个元素,items以便您可以为该查询返回它。

private ElasticsearchTemplate elasticsearchTemplate;

String[] includes = new String[]{"name", "firstItem"};
SearchQuery searchQuery = new NativeSearchQueryBuilder()
    .withQuery(matchAllQuery())
    .withSourceFilter(new FetchSourceBuilder(includes, null))
    .build();

Page<User> userPage =
    elasticsearchTemplate.queryForPage(searchQuery, User.class);
2020-06-22