【问题标题】:Getting count and list of ids using ElasticsearchTemplate in spring-data-elasticsearch在 spring-data-elasticsearch 中使用 ElasticsearchTemplate 获取 id 的计数和列表
【发布时间】:2016-05-17 02:00:03
【问题描述】:

我正在使用 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<T> clazz, SearchResultMapper mapper) 中使用未使用@Document 注释的自定义类吗?实际的文档类非常大,如果我不确定传递大型类是否会导致引擎上的任何额外负载,因为有超过 100 个字段要进行 json 映射,但我只需要 id 字段。无论如何,我将在查询生成器中有一个.withFields("id")

【问题讨论】:

  • 简单删除问题后,编辑如何获得批准?我理解从描述中删除多余的文本(尽管不确定“提前致谢”会如何伤害这个堆栈溢出社区。我正在重新编辑我的问题标题,因为该部分的编辑很愚蠢,它删除了重要信息问题。人们几乎不会对阅读该死的“计数和ID”感兴趣。

标签: java elasticsearch spring-data spring-data-elasticsearch


【解决方案1】:

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

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

    @Override
    public SearchResult extract(SearchResponse response) {
        long totalHits = response.getHits()
                .totalHits();
        List<String> ids = new ArrayList<String>();
        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<String> ids;
    long count;

    //getter and setter
}

这样你就可以从elasticsearchSearchResponse获取你需要的信息了。

关于您的第二个问题:据我所知,在致电queryForPage(SearchQuery query, Class&lt;T&gt; clazz, SearchResultMapper mapper) 时 未检查传递的类是否有 @Document 注释。试试看吧!

【讨论】:

【解决方案2】:

也可以考虑使用AggregatedPage&lt;T&gt;。可以像Pageable&lt;T&gt;一样获取总记录数、总页数、当前页记录等。

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

AggregatedPage<ElasticDTO> queryResult = elasticsearchTemplate.queryForPage(searchQuery , ElasticDTO.class);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 2014-08-15
    • 2019-12-31
    相关资源
    最近更新 更多