Как сделать простой поиск в строке в базе данных Firebase?

Я хочу создать простой поиск в своем приложении, но не могу найти что-либо в interwebs об этом, что более поздно, чем 2014. Должен быть лучший способ. Существуют функции startAt и endAt, но они не работают должным образом и чувствительны к регистру. Как вы решаете эту проблему? Как эта функция еще не существует в 2016 году?

Ответы

Ответ 1

В моем случае мне удалось частично добиться SQL LIKE следующим образом:

databaseReference.orderByChild('_searchLastName')
                 .startAt(queryText)
                 .endAt(queryText+"\uf8ff")

Символ \uf8ff используемый в запросе, является очень высокой кодовой точкой в диапазоне Юникода (это код [PUA] Частной области использования). Поскольку это после большинства обычных символов в Unicode, запрос соответствует всем значениям, которые начинаются с queryText.

Таким образом, выполняя поиск по "Fre", я мог получить записи, имеющие "Fred, Freddy, Frey" в качестве значения в _searchLastName из базы данных.

Ответ 2

Firebase - это noSQL, поэтому он не имеет встроенных поисков, как в SQL. Вы можете сортировать по значениям/ключу или можете равняться

https://firebase.google.com/docs/database/android/retrieve-data

Вы можете найти примеры по ссылке выше. Это последняя документация для FireBase.

Если вы ищете SQL, как поиск. Тогда взгляните на упругий поиск. Но это увеличит сложность, так как вам нужна платформа для ее установки. Для этого я мог бы порекомендовать Heroku или, возможно, GoogleCloudServers

Вот запись в блоге о расширенных поисках с упругим поискомhttps://firebase.googleblog.com/2014/01/queries-part-2-advanced-searches-with.html

Ответ 3

Этот вопрос может быть старым, но есть документированный способ достижения этого, его легко реализовать. Цитируется:

Чтобы включить полнотекстовый поиск по вашим данным в Cloud Firestore, воспользуйтесь сторонней поисковой службой, такой как Algolia. Рассмотрим приложение для создания заметок, где каждая заметка является документом:

Algolia будет частью ваших firebase functions и будет выполнять все ваши поиски.

// Update the search index every time a blog post is written.
exports.onNoteCreated = functions.firestore.document('notes/{noteId}').onCreate(event => {
      // Get the note document
      const note = event.data.data();

      // Add an 'objectID' field which Algolia requires
      note.objectID = event.params.noteId;

      // Write to the algolia index
      const index = client.initIndex(ALGOLIA_INDEX_NAME);
      return index.saveObject(note);
});

Для осуществления поиска лучше всего использовать мгновенный поиск - Android


Образец поиска изображения: GIF

Ответ 4

Я не знаю о уверенности в этом подходе, но используя версию firebase 10.2.6 на android, я могу сделать что-то вроде этого:

firebaseDatabase.getReference("parent")
                            .orderByChild("childNode")
                            .startAt("[a-zA-Z0-9]*")
                            .endAt(searchString)

Кажется, что это хорошо работает иногда

Ответ 5

Я в моем случае использовал:

var query = 'text'
databaseReference.orderByChild('search_name')
             .startAt('%${query}%')
             .endAt(query+"\uf8ff")
             .once("value")

Таким образом, при поиске по "test" я мог получить записи, имеющие "Test 1, Contest, One test" в качестве значения в свойстве "search" из базы данных.

Ответ 6

Чтобы ответить на некоторые вопросы людей, как искать "пт" и показывать "Frid", "Fries", "Friii". Вы можете легко сделать это, добавив .toUpperCase() внутри startAt метода и .toLowerCase() внутри endAt метода

в этом изображении я ищу базу имен пользователей по имени пользователя в базе данных Firebase