使用 Firebase 实时数据库的 SearchView 需要很长时间才能得出结果,而且价格昂贵
SearchView with Firebase RealTime Database is taking too long to bring results and it's expensive
我正在尝试通过我的应用程序中带有搜索视图的邮件来获取特定用户。
我的数据库中有 7000 多个用户,使用此搜索视图需要 5 到 10 或 15 秒来过滤和获取数据
@Override
public boolean onQueryTextSubmit(String s) {
searchQuery.startAt(s).endAt(s+"\uf8ff").limitToFirst(3).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot snapshot : dataSnapshot.getChildren()){
UserPojo user = snapshot.getValue(UserPojo.class);
Log.i(TAG, "onDataChange: " + user.getEmail());
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
return false;
}
问题是过滤数据所花费的时间(从 5 到 15 秒)
有没有更好的查询来更快地过滤?或者我是否需要首先获取所有数据,存储在本地,然后在客户端对其进行过滤?关于如何处理这个的任何建议?
我还注意到探查器每次搜索都需要 4 到 8mb 的网络才能完成,这对于一个简单的文本查询来说就需要大量的网络。
See network usage here
谢谢
听起来您可能没有在您正在搜索的字段上定义索引。如果没有索引,则无法在服务器上进行过滤。所以在那种情况下,服务器将所有数据发送到客户端,客户端进行过滤。这可以解释为什么它花费的时间比您预期的要长:它必须将所有 7000 个用户配置文件发送到客户端。
如果这确实是问题的原因,您可以通过在规则文件中添加索引来修复它。假设您是 ordering/filtering 一个名为 users
的列表,位于一个名为 email
的 属性 上,您可以通过以下方式实现:
{
"rules": {
"users": {
".indexOn": "email"
}
}
}
有关此主题的更多信息,请参阅 Firebase documentation on indexing data。
我正在尝试通过我的应用程序中带有搜索视图的邮件来获取特定用户。
我的数据库中有 7000 多个用户,使用此搜索视图需要 5 到 10 或 15 秒来过滤和获取数据
@Override
public boolean onQueryTextSubmit(String s) {
searchQuery.startAt(s).endAt(s+"\uf8ff").limitToFirst(3).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot snapshot : dataSnapshot.getChildren()){
UserPojo user = snapshot.getValue(UserPojo.class);
Log.i(TAG, "onDataChange: " + user.getEmail());
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
return false;
}
问题是过滤数据所花费的时间(从 5 到 15 秒)
有没有更好的查询来更快地过滤?或者我是否需要首先获取所有数据,存储在本地,然后在客户端对其进行过滤?关于如何处理这个的任何建议?
我还注意到探查器每次搜索都需要 4 到 8mb 的网络才能完成,这对于一个简单的文本查询来说就需要大量的网络。
See network usage here
谢谢
听起来您可能没有在您正在搜索的字段上定义索引。如果没有索引,则无法在服务器上进行过滤。所以在那种情况下,服务器将所有数据发送到客户端,客户端进行过滤。这可以解释为什么它花费的时间比您预期的要长:它必须将所有 7000 个用户配置文件发送到客户端。
如果这确实是问题的原因,您可以通过在规则文件中添加索引来修复它。假设您是 ordering/filtering 一个名为 users
的列表,位于一个名为 email
的 属性 上,您可以通过以下方式实现:
{
"rules": {
"users": {
".indexOn": "email"
}
}
}
有关此主题的更多信息,请参阅 Firebase documentation on indexing data。