Поиск по вложенной структуре Firebase - PullRequest
0 голосов
/ 07 мая 2018

Я храню список пользователей в Firebase. Структура выглядит так:

enter image description here

В моем приложении для Android я хочу позволить пользователю гибко искать любого пользователя. Поэтому Джон Смит должен отображаться в результатах, если пользователь ищет такие вещи, как: Joh ..., Smit ..., jsmi ... . Кроме того, я хочу, чтобы результаты поиска отображались мгновенно по мере ввода пользователем текста (например, Instagram).

В настоящее время это моя реализация. Я открываю все данные пользователя, когда открывается поисковая операция, и сохраняю все данные в ArrayList. Затем, когда пользователь начинает поиск, я ищу ArrayList и возвращаю совпадения.

Ниже приведен пример кода:

ArrayList<User> listOfUsers = new ArrayList<>();

ref.child("Users").addListenerForSingleValueEvent(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot dataSnapshot) {
    for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) {
      User user = userSnapshot.getValue(User.class);
      listOfUsers.add(user);
    }
  }

  @Override
  public void onCancelled(DatabaseError databaseError) { }
});

// Then I search for users like this
for (User user : listOfUsers) {
   if (user.getFullname.contains("Joh") || 
      user.getUsername.contains("Joh")){
      // show user in results
   }
}

Прямо сейчас работает нормально, потому что у меня не так много пользователей. Но я чувствую, что если у меня есть 100 тыс. Пользователей, то вытащить все их детали заранее и проанализировать список массивов из 100 тыс. Элементов для поиска совпадений может оказаться дорогостоящим. Что было бы лучшим решением?

1 Ответ

0 голосов
/ 08 мая 2018

Firebase не поддерживает собственную индексацию или поиск текстовых полей в базе данных. Кроме того, загрузка всего узла для поиска полей на стороне клиента нецелесообразна, в большинстве случаев из-за размера.

К сожалению, Firebase также не позволяет создавать поиск по нескольким свойствам. Поэтому такой запрос не допускается.

usersRef
    .whereEqualTo("name", "John Smith")
    .whereEqualTo("username", "jsmith"); //Not allowed

Но если вы хотите запросить базу данных на основе одного свойства для таких вещей, как: Joh..., но , а не Smit..., такой запрос требует:

usersRef
    .whereEqualTo("name", "Joh")
    .startAt(searchText).endAt(searchText + "\uf8ff");

Если вы хотите использовать более новую версию базы данных, я рекомендую попробовать Cloud Firestore . Чтобы включить полнотекстовый поиск в вашей базе данных Cloud Firestore, вы можете использовать стороннюю службу поиска по имени Algolia , которая поможет вам достичь именно того, что вам нужно. И для этого я рекомендую посмотреть мой ответ от этого поста . Для получения дополнительной информации, я также рекомендую вам посмотреть это видео .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...