Ricerca in Firebase senza codice lato server

Sto cercando di ottenere che tutti gli utenti abbiano il nome che contiene una stringa data da Firebase. Ad esempio, se ho questi utenti:

Devid, Andy, Bob 

Mi piacerebbe che tutti gli utenti avessero il nome che contiene una “D”, quindi mi aspetto che questo sia il risultato:

 Devid, Andy 

Questa è la struttura del mio Firebase al momento:

inserisci la descrizione dell'immagine qui

Dal momento che Firebase fa distinzione tra maiuscole e minuscole, ho creato un attributo name_ che contiene il nome in minuscolo.

Usando startAt e endAt posso ottenere tutti gli utenti con il nome che inizia con una stringa definita

 ref.orderByChild("name_").startAt(text).endAt(text+"\uf8ff").on('value', ...); 

Ma questo mi dà solo gli utenti che hanno il nome che inizia con una determinata stringa, per esempio se il testo è ‘D’, io otterrò:

 Devid 

1) Al momento la mia domanda significa “dammi tutti gli utenti che hanno il nome_ che inizia con una determinata stringa” c’è un modo per far sì che significhi “darmi a tutti gli utenti il ​​nome che contiene una determinata stringa”? MODIFICA: NO

Le query Firebase non hanno nulla di simile agli operatori di ricerca full-text. Per realizzarli, dovrai integrare un motore di ricerca full-text esterno o elaborare uno schema di indicizzazione personalizzato molto elaborato. Firebase e indicizzazione / ricerca

2) Al momento non voglio avere il codice lato server, quale può essere un modo valido ed efficace per implementare gli indici personalizzati?

Grazie

Ok, non c’è modo di fare esattamente quello che vuoi con la tua struttura attuale.

Comunque questo mi è appena venuto in mente:

 users: user_1234 first_name: "Devid" components: "D": true "e": true "v": true "i": true "d": true user_5678 first_name: "Andy" components: "A": true "n": true "d": true "y": true user_1010 first_name: "Bob" components: "B": true "o": true "b": true 

ed ecco un codice ObjC per farlo accadere (ed è testato!)

 Firebase *ref = [myRootRef childByAppendingPath:@"users"]; FQuery *q1 = [ref queryOrderedByChild:@"components/b"]; FQuery *q2 = [q1 queryEqualToValue:@1]; [q2 observeEventType:FEventTypeChildAdded withBlock:^(FDataSnapshot *snapshot) { NSLog(@"%@", snapshot.value); }]; 

Questo codice restituisce Bob.

Per ottenere tutte le persone “d”, modifica i “componenti / b” in “componenti / d”

Modificare:

Puoi diventare davvero pazzo e aggiungere più combinazioni per espandere la tua capacità di ricerca

 users: user_1234 first_name: "Devid" components: "D": true "e": true "v": true "i": true "d": true "De": true "Dev": true "Devi": true "Devid": true "ev": true "evi": true "evid": true ... etc 

Sarebbe piuttosto semplice codificare alcune righe di codice per scorrere il nome e scrivere le combinazioni.

Ovviamente sarebbe molto più efficiente (se si dispone di un set di dati limitato) solo leggere tutti i nomi in uno snapshot, scaricarli in un array e (in ObjC) utilizzare un NSPredicate per estrarre ciò di cui si ha bisogno.

La libreria oxyzen in github ti dà gli inserti e gli aggiornamenti con qualche firebase avvolto

per la parte di indicizzazione fondamentalmente la funzione:

  1. JSON stringifica un documento.
  2. rimuove tutti i nomi di proprietà e JSON per ricevere solo i dati (regex).
  3. rimuove tutti i tag xml (quindi anche html) e gli attributi (ricorda la vecchia guida, “i dati non dovrebbero essere negli attributi xml”) per lasciare solo il testo puro se era presente xml o html.
  4. rimuove tutti i caratteri speciali e sostituisce con lo spazio (regex)
  5. sostituisce tutte le istanze di più spazi con uno spazio (regex)
  6. si divide in spazi e cicli:
  7. per ogni parola aggiunge riferimenti al documento in una struttura di indice nel tuo db che fondamentalmente contiene child chiamati con parole con child nominati con una versione di “ref / inthedatabase / dockey” di escape
  8. quindi inserisce il documento come farebbe una normale applicazione firebase

nell’implementazione di oxyzen, i successivi aggiornamenti del documento LEGGONO ATTUALMENTE l’indice e lo aggiornano, rimuovendo le parole che non corrispondono più e aggiungendone di nuove.

ricerche successive di parole possono facilmente trovare documenti nelle parole bambino. le ricerche di più parole sono implementate utilizzando hit