【问题标题】:get one field from elasticsearch by spring data通过spring数据从elasticsearch中获取一个字段
【发布时间】:2017-01-20 13:24:45
【问题描述】:

我有一个这样的 ES 文档

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

我正在使用 Spring Data 通过 Repository 接口与 ES 对话

interface UserRepository extends Repository<User, String> {
}

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

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

因为User中的describeitems非常大,所以从ES中检索所有字段非常昂贵。

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

如何在spring数据中做到这一点?

【问题讨论】:

    标签: spring elasticsearch


    【解决方案1】:

    您需要的是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);
    

    【讨论】:

    • firstItem 不是字段名称。我的意思是items 的第一项。我尝试使用items[0],但似乎不起作用。 ES 支持吗?
    • 这就是我所说的,您应该创建另一个名为 firstItem 的字段,该字段将包含与 items[0] 相同的值
    • 这个运气好吗?
    • 酷,很高兴它有帮助!
    • 检索字段和返回字段有什么区别?检索并返回听起来像是同一事物的同义词给我
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 2020-01-07
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多