我现在将spring-boot
和spring-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
前缀,或者通过使用spring数据弹性搜索发送Count API
?或者,有没有任何方法可以实现一个查询,在不定义自定义查询的情况下查找一天范围内的数据列表?
谢谢!
- 您可以使用
@CountQuery
而不是@Query
(或将参数count = true
添加到@Query
注释中(,并将存储库方法的返回值更改为long
- 这应该与查询派生和类似
long countByUsernameAndCreatedTimeBetween(String username, Instant from, Instant two)
的方法名一起使用——我还没有测试过这一点。你需要计算日期参数
我将使用方法long userWithinADay(String user)
创建一个自定义存储库片段,在实现中,我将为名称和日期创建一个CriteriaQuery
,并将其传递给ElasticsearchOperations.count()
方法之一。
编辑:
在Spring Data Elasticsearch 4.2中添加了@CountQuery
。