我使用apache ignite缓存作为数据存储。想知道是否有一种方法可以从客户端分页大数据集合。我不需要或不想将数百万条记录从服务器传输到我的Web /移动客户端。
private final ClientCache<UUID, Account> accounts;
public List<Account> getAll(int offset, int limit)
{
return accounts.query(new ScanQuery<UUID, Account>()
.setLocal(false))
.getAll()
.stream()
.skip(offset)
.limit(limit)
.map(entity -> entity.getValue())
.collect(Collectors.toList());
}
这是一种有效的方法吗?
我看过使用游标,但API仅限于迭代器...
谢谢。
答案 0 :(得分:1)
我在您的代码中看到一个"query":{
"must":[
{
"bool":{
"must_not":[
{
"match":{
"user.status_id":152
}
}
]
}
},
{
"function_score":{
"functions":[
{
"filter":{
"term":{
"user.status_id":150
}
},
"weight":10
}
]
}
},
{
"query_string":{
"query":"sales",
"type":"phrase",
"fields":[
"user.job_title^12",
"user.company_name^5",
"user.name^6"
]
}
},
{
"function_score":{
"functions":[
{
"filter":{
"nested":{
"path":"keywords.active",
"query":{
"bool":{
"must":[
{
"term":{
"keywords.active.is_active":true
}
},
{
"match_phrase":{
"keywords.active.word":"sales"
}
}
]
}
}
}
},
"weight":9000
}
]
}
}
]
}
。它使所有数据都传输到调用方。这正是您想要避免的。
getAll()
避免了这个问题,因为数据是按需批量加载的。因此,在运行查询时,您不必将所有内容都加载到单个节点的内存中。页面大小可以通过设置ScanQuery#pageSize属性来配置。默认情况下,它等于1024。可以通过调用Iterator
方法来获取迭代器。因此,除了保留偏移量之外,您还需要保留一个迭代器。
SQL SELECT查询也是一个选项。但是,如果您有多个节点,则在执行过程中,LIMIT + OFFSET记录将从每个节点加载到reducer。您应该考虑到这一点。