当前位置:  开发笔记 > 编程语言 > 正文

在spring-data-elasticsearch中使用ElasticsearchTemplate获取计数和id列表

如何解决《在spring-data-elasticsearch中使用ElasticsearchTemplate获取计数和id列表》经验,为你挑选了1个好方法。

我正在为项目使用spring-data-elasticsearch为其提供全文搜索功能.我们将真实数据保存在关系数据库和相关元数据中以及弹性搜索中的相应ID.因此,对于搜索结果,只需要id字段,因为将从关系数据库中检索实际数据.

我正在构建基于搜索条件的搜索查询,然后执行queryForIds():

    SearchQuery searchQuery = new NativeSearchQueryBuilder()
            .withIndices(indexName)
            .withTypes(typeName)
            .withQuery(getQueryBuilder(searchParams))
            .withPageable(pageable)
            .build();

    return elasticsearchTemplate.queryForIds(searchQuery);

如果我还需要特定searchQuery的总计数,我可以再做一次elasticsearchTemplate.count(searchQuery)调用,但是根据我的理解,这将是多余的.我认为有一种方法可以通过使用类似于elasticsearchTemplate.queryForPage()单个调用的方式来获取id和总计数列表.

另外,我可以使用queryForPage(SearchQuery query, Class clazz, SearchResultMapper mapper)未注释的自定义类@Document吗?实际的文档类非常大,如果我不确定传递大类是否会导致引擎上的任何额外负载,因为有超过100个字段要进行json映射,但我需要的只是id字段..withFields("id")无论如何,我将在查询构建器中有一个.



1> 小智..:

如果你想阻止两次调用elasticsearch,我建议写一个自定义的ResultsExtractor:

SearchQuery searchQuery = new NativeSearchQueryBuilder().withIndices(indexName)
        .withTypes(typeName)
        .withQuery(queryBuilder)
        .withPageable(pageable)
        .build();
SearchResult result = template.query(searchQuery, new ResultsExtractor() {

    @Override
    public SearchResult extract(SearchResponse response) {
        long totalHits = response.getHits()
                .totalHits();
        List ids = new ArrayList();
        for (SearchHit hit : response.getHits()) {
            if (hit != null) {
                ids.add(hit.getId());
            }
        }
        return new SearchResult(ids, totalHits);
    }
});
System.out.println(result.getIds());
System.out.println(result.getCount());

SearchResult是一个自定义类:

public class SearchResult {

    List ids;
    long count;

    //getter and setter
}

这样,您就可以从elasticsearch获取所需的信息SearchResponse.

关于你的第二个问题:据我所知,在调用queryForPage(SearchQuery query, Class clazz, SearchResultMapper mapper) 传递的类时没有检查@Document注释.试试吧!

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有