当前位置: 首页 > 知识库问答 >
问题:

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

羿宏硕
2023-03-14

我有一份这样的ES文档

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

我正在使用Spring数据通过存储库接口与ES对话

interface UserRepository extends Repository<User, String> {
}

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

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

由于用户中的描述非常大,因此从ES中检索所有字段非常昂贵。

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

如何在spring数据中实现这一点?

共有1个答案

孔梓
2023-03-14

您需要混合使用源筛选(用于不检索重字段)和响应筛选(用于不返回重字段)。然而,后者在Spring Data ES(尚未)中不受支持

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

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);
 类似资料:
  • 问题内容: 我有这样的ES文档 我正在使用Spring数据通过Repository接口与ES通讯 现在,我需要构建一个rest接口,以像这样响应JSON格式的数据 由于and in 很大,因此从ES检索所有字段非常昂贵。 我知道ES具有名为“响应过滤”的功能,可以满足我的要求,但是我找不到在Spring Data中使用它的方法。 如何在Spring数据中执行此操作? 问题答案: 您需要混合使用源过

  • 我想通过“id”从我的mongodb获取数据。如果我的id与mongodb中id的值匹配,则它将获取该对象,但其抛出错误为: {“message”:“对于模型“PostMessage”“”的路径“\u id”处的值“s-CoAhDKd”,转换为ObjectId失败}

  • 问题内容: 我的页面上有一个通过URL调用spring控制器的页面。 现在,控制器看起来像 我发送的数据使用模式,并试图访问它的,但它显示为空白。 有什么方法可以在查看页面上接收该数据? 问题答案: 您必须为Spring Ajax调用示例添加@ResponseBody批注

  • 我希望从ES中获得聚合结果,例如,对于与术语匹配的文档,

  • 我得到了这段代码,但我认为这是不好的方法,如果有像100K的结果,它会返回100K的新用户怎么办?对于,我是否可以使用其他方法,但我不太确定如何实现。另外,是否应该使用块?

  • 我创建了一个名为的类来从firebase数据库中获取所有用户数据。下面是我用来获取firebase数据(用户名)的方法。 而firebase链接也没有问题。它还提供了用户名。 当我用一些虚拟的预定义字符串数据替换username时,这段代码就可以工作了。但是当我添加用户名时,它会给我以下错误。