Объединение Firebase Queries с GeoQuery для поиска постов по имени в соседней области - PullRequest
0 голосов
/ 23 января 2020

Я создаю приложение android, в котором пользователь может найти книгу поблизости и купить ее, если заинтересован. Я использую firebase и geoqueries / geofire. Я хочу создать функцию SearchActivity, в которой пользователь может искать книгу по названию в своем районе.

моя структура базы данных Firebase выглядит следующим образом:

books
   PushKey
      g:
      l:
         0:
         1:
      name:"some book name"

Если я попытаюсь сделать запрос с помощью какое-то название книги, оно отлично работает, используя:

myRef.orderByChild("name").equalTo("some book name").addChildEventListener()....//The rest of the code here...

Если я пытаюсь запросить близлежащие книги, то также оно отлично работает, используя:

geoQuery = geoFire.queryAtLocation(myLocation, 10);

Я застрял при объединении этих двух , Как я могу найти определенное c название книги только поблизости? Например: я хочу найти книгу, которая называется «ABCD» и находится в радиусе 10 км. ИЛИ Поиск книги по имени и скажите, какая из них ближайшая (в случае, если несколько книг загружены с одинаковым именем в разных местах). Возможно ли это сделать? Если нет, то какой обходной путь (возможно, кроме firebase, но должен быть дешевым и доступным), я могу выбрать, где я могу достичь этого желаемого результата?

1 Ответ

0 голосов
/ 23 января 2020

База данных Firebase может запрашивать только по одному свойству. Тот факт, что GeoFire делает что-то, что, по-видимому, расходится с этим (запросы по долготе и широте), заключается в том, что он объединяет эти значения в одно свойство в магическом формате, называемом geoha sh (свойство g в вашем * 1030). *).

Объединение значений в одно свойство - единственный способ заставить Firebase фильтровать несколько значений. Например, вы можете добавить префикс g к названию книги, чтобы получить some book name_geohashvalue, а затем фильтровать по нему.

Две основные проблемы с этим:

  1. Это работает, только если вы знаете весь заголовок книги, вы можете выполнить сопоставление префикса для заголовка, поскольку вам уже нужно будет использовать сопоставление префикса для geoha sh.
  2. Это не встроено в GeoFire, так что вам придется раскошелиться на эту библиотеку и собрать ее самостоятельно.

Если вы попытаетесь сделать это самостоятельно и застрять, мы можем попытаться помочь. Но справедливое предупреждение: это не будет тривиальным, и вам нужно будет понять, как геохэш, геофайр и модель запросов Firebase работают достаточно хорошо. Для вступления я рекомендую посмотреть видео моего выступления о выполнении гео-запросов в Firebase и Firestore .

Если вы хотите что-то немного менее сложное, у вас есть два основных варианта:

  1. Извлечение всех узлов в пределах диапазона, а затем фильтрация по заголовку книги на стороне клиента.
  2. Сохранение отдельного дерева GeoFire для каждого заголовка книги, чтобы вы могли инициализировать свой объект GeoFire на основе название книги, и только получите ключи в пределах диапазона для этого указанного c названия книги.

Между этими двумя я бы рекомендовал начать с # 1.

...