Buscando en Firebase sin código del lado del servidor
firebase-realtime-database database (2)
Estoy tratando de que todos los usuarios tengan el nombre que contiene una cadena dada de Firebase. Por ejemplo, si tengo estos usuarios:
Devid, Andy, Bob
Me gustaría que todos los usuarios tengan el nombre que contiene una ''D'', así que espero esto como resultado:
Devid, Andy
Esta es la estructura de mi Firebase en este momento:
Como Firebase distingue entre mayúsculas y minúsculas, he creado un atributo
name_
que contiene el nombre en minúsculas.
Usando startAt y endAt puedo obtener todos los usuarios con el nombre que comienza con una cadena definida
ref.orderByChild("name_").startAt(text).endAt(text+"/uf8ff").on(''value'', ...);
Pero esto me da solo los usuarios que tienen el nombre que comienza con una cadena dada, por ejemplo, si el texto es ''D'' obtendré:
Devid
1) En el momento en que mi consulta significa, "dame todos los usuarios que tienen un nombre_ que comienza con una cadena dada" ¿hay alguna manera de que signifique "darme a todos los usuarios cuyo nombre contiene una cadena dada"? EDITAR: NO
Las consultas de Firebase no tienen nada similar a los operadores de búsqueda de texto completo. Para lograrlos, tendrá que integrar un motor de búsqueda externo de texto completo o crear un esquema de indexación personalizado muy elaborado. Firebase e indexación / búsqueda
2) En este momento no quiero tener un código del lado del servidor, ¿cuál puede ser una forma buena y eficiente de implementar índices personalizados?
Gracias
Ok, no hay forma de hacer exactamente lo que quieres con tu estructura actual.
Sin embargo, esto me vino a la cabeza:
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
y aquí hay un código ObjC para que suceda (¡y está probado!)
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);
}];
Este código devuelve a Bob.
Para obtener todas las personas ''d'', cambie los "componentes / b" a "componentes / d"
Editar:
Puede volverse realmente loco y agregar más combinaciones para ampliar su capacidad de búsqueda
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
Sería bastante simple codificar algunas líneas de código para iterar sobre el nombre y escribir las combinaciones.
Obviamente, sería mucho más eficiente (si tiene un conjunto de datos limitado) simplemente leer todos los nombres en la instantánea, volcarlos en una matriz y (en ObjC) usar un NSPredicate para obtener lo que necesita.
La biblioteca Oxyzen en Github hace eso dado que usted hace inserciones y actualizaciones con alguna base de fuego envuelta
para la parte de indexación básicamente la función:
- JSON stringifica un documento.
- elimina todos los nombres de propiedad y JSON para alejar solo los datos (regex).
- elimina todas las etiquetas xml (por lo tanto, también html) y atributos (recuerde la guía anterior, "los datos no deben estar en atributos xml") para dejar solo el texto puro si xml o html estaban presentes.
- elimina todos los caracteres especiales y los sustituye por espacios (expresiones regulares)
- sustituye todas las instancias de múltiples espacios con un espacio (regex)
- se divide en espacios y ciclos:
- para cada palabra agrega referencias al documento en alguna estructura de índice en su base de datos que básicamente contiene elementos secundarios nombrados con palabras con elementos secundarios nombrados con una versión escapada de "ref / inthedatabase / dockey"
- luego inserta el documento como lo haría una aplicación Firebase normal
En la implementación de Oxyzen, las actualizaciones posteriores del documento REALMENTE leen el índice y lo actualizan, eliminando las palabras que ya no coinciden y agregando las nuevas.
Las búsquedas posteriores de palabras pueden encontrar fácilmente documentos en las palabras niño. las búsquedas de palabras múltiples se implementan usando hits