首页 > 解决方案 > 有什么方法可以在 spring-data-elasticsearch 中使用“countBy”前缀和我的自定义查询?

问题描述

我现在正在使用spring-bootandspring-data-elasticsearch用于我的 java 项目。

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

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

谢谢!

标签: javaelasticsearchspring-data-elasticsearch

解决方案


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

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

编辑:

@CountQuery在 Spring Data Elasticsearch 4.2 中添加。


推荐阅读