我有这样的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
中的items
和User
非常大,因此从ES中检索所有字段的费用非常昂贵。
我知道ES有一个名为“Response Filtering”的功能,可以满足我的要求,但我找不到在Spring Data中使用它的方法。
如何在弹簧数据中执行此操作?
答案 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);