SearchView с Firebase RealTime Database занимает слишком много времени, чтобы принести результаты, и это дорого - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь получить конкретного пользователя по почте с поиском в моем приложении.

В моей базе данных более 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 до 8 Мб сети, чтобы выполнить, это много сетевого использования для простого текстового запроса.

См. Использование сети здесь

спасибо

1 Ответ

0 голосов
/ 29 августа 2018

Похоже, вы не определили индекс для поля, которое вы ищете. Если индекс отсутствует, фильтрация на сервере невозможна. Таким образом, в этом случае сервер отправляет все данные клиенту, который выполняет фильтрацию. Это объясняет, почему это занимает больше времени, чем вы ожидаете: он должен отправить все 7000 пользовательских профилей клиенту.

Если это действительно является причиной проблемы, вы можете исправить ее, добавив индекс в ваш файл правил. Допустим, вы упорядочиваете / фильтруете список с именем users для свойства с именем email, и вы делаете это следующим образом:

{
  "rules": {
    "users": {
      ".indexOn": "email"
    }
  }
}

Подробнее об этом см. Документацию Firebase по индексированию данных .

...