有什么方法可以在 spring-data-elasticsearch 中将 'countBy' 前缀与我的自定义查询一起使用?

Is there any way that I could use 'countBy' prefix with my custom query in spring-data-elasticsearch?

我现在正在为我的 java 项目使用 spring-bootspring-data-elasticsearch

我必须统计每天报告一些数据的用户数量,所以我为它创建了一个自定义查询,

public interface UserInfoRepository extends ElasticsearchRepository<UserInfo, String> {
    @Query("{\"bool\": {\"must\": [{\"match\": {\"username\": \"?0\"}},{\"range\": {\"createdTime\": {\"gt\": \"now-1d/d\",\"lt\": \"now+1d/d\"}}}]}}")
    List<UserInfo> findByUserNameWithinDayRange(String username);
}

并通过以下代码获取用户数。

private long numberOfUser (String username) {
    List<UserInfo> userInfoWithinADay = suggestionRepository.findByUserNameWithinDayRange(ip);

    return userInfoWithinADay.size();
}

但是,我觉得这种方式效率很低;我不需要 UserInfo 的整个列表,只需要它们的“命中”信息。

我能知道有什么方法可以在我的自定义查询中使用 countBy 前缀,或者使用 spring-data-elasticsearch 发送 Count API 吗?或者有什么方法可以在不定义自定义查询的情况下实现可以找到一天范围内的数据列表的查询?

谢谢!

  1. 您可以使用@CountQuery代替@Query(或将参数count = true添加到@Query注释中)——并更改return的值long.
  2. 的存储库方法
  3. 这应该适用于查询派生和方法名称,如 long countByUsernameAndCreatedTimeBetween(String username, Instant from, Instant two) - 我还没有测试过。你需要计算日期参数

我会使用方法 long userWithinADay(String user) 创建一个自定义存储库片段,在实现中我会为名称和日期创建一个 CriteriaQuery 并将其传递给 ElasticsearchOperations.count() 方法。

编辑:

@CountQuery 已添加到 Spring Data Elasticsearch 4.2。