Elasticsearch Java REST 客户端:查看符合条件的命中数是否超过 SearchSourceBuilder 大小

Elasticsearch Java REST Client: see if number of eligible hits exceeded SearchSourceBuilder size

我有一个 Elasticsearch 请求:

SearchSourceBuilder source = new SearchSourceBuilder()
    .size(limit)
    .from(offset)
    .query(queryBuilder)
SearchRequest searchRequest = new SearchRequest(indexName)
        .types(type)
        .source(source);
SearchResponse searchResponse = client.search(searchRequest);

我需要根据 returned 的结果数量是否受到 limit 参数的限制(换句话说,是否有更多结果 return)。有没有办法查看与查询匹配的合格搜索命中数是否超过 limit,而不是执行另一个查询,或者将大小设置为 limit + 1 并删除响应中的最后一个命中?

Elasticsearch returns 在 hits.totalHits 属性 响应中与您的查询匹配的文档总数。如果它大于 offset+limit 那么你有下一页。

我认为你首先需要的只是一个计数搜索,我的意思是做你想要的查询并将 size 设置为 0 这使得结果只是 return总点击量,这里可以得到每页的大小。

    int pageSize = 10;
    long totalCount = searchResponse.getHits().getTotalHits();
    PageCount pageCount = new PageCount();
    if (totalCount <= 0)
        return result;
    long pages = (totalCount < pageSize) ? 1l : ((totalCount % pageSize) == 0) ? (totalCount / pageSize) : ((totalCount / pageSize) + 1);

    if (totalCount <= 10000) {
        result.setTotal(totalCount);
        result.setPages(pages);
    } else {
        result.setTotal(10000);
        result.setPages((10000 / pageSize));
    }

这里我使用 10000 作为限制,以便 Elasticsearch 限制它消耗的内存量。获得此信息后,您可以 return 查询页数并对给定页面提出请求。

完成后,您可以设置搜索请求,例如:

    long size = ((pageCount.getTotal() < pageSize) ? pageCount.getTotal() : pageSize);
    if (pageCount.getTotal() > pageSize && (page + 1) >= pageCount.getPages()) {
        size = ((pageCount.getTotal() % pageSize) != 0 ? pageCount.getTotal() % pageSize : pageSize);
    }
    searchRequest.setSize((int) size).setFrom((int) (page * pageSize))

这只是示例代码,希望对您有所帮助。

干杯