通过弹簧数据从elasticsearch获取一个字段

时间:2016-09-13 03:02:23

标签: spring 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}

由于describe中的itemsUser非常大,因此从ES中检索所有字段的费用非常昂贵。

我知道ES有一个名为“Response Filtering”的功能,可以满足我的要求,但我找不到在Spring Data中使用它的方法。

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

1 个答案:

答案 0 :(得分:0)

您需要的是source filtering(不是检索重字段)和response filtering(不是返回重字段)的混合。但是,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);