Búsqueda en Firebase sin código de servidor

Estoy intentando que todos los usuarios tengan el nombre que contiene una cadena determinada 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 que esto sea el resultado:

 Devid, Andy 

Esta es la estructura de mi Firebase en este momento:

enter image description here

Dado que Firebase distingue entre mayúsculas y minúsculas, he creado un nombre de atributo_ que contiene el nombre en minúscula.

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, “darme todos los usuarios con nombre_ que comienza con una cadena dada”, ¿hay alguna forma de que signifique “darme todos los usuarios cuyo nombre contiene una cadena determinada”? 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 de texto completo externo o crear un esquema de indexación personalizado muy elaborado. Firebase e indexación / búsqueda

2) Por el momento no quiero tener el código del lado del servidor, ¿cuál puede ser una buena y eficiente manera de implementar índices personalizados?

Gracias

    Ok, no hay forma de hacer exactamente lo que quieres con tu estructura actual.

    Sin embargo, esto acaba de aparecer en mi 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 hacerlo realidad (¡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:

    Puedes volverte loco y agregar más combinaciones para expandir tu 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 limitado de datos) leer todos los nombres en una instantánea, volcarlos en una matriz y (en ObjC) usar NSPredicate para extraer lo que necesita.

    La biblioteca oxyzen en github hace eso, dado que se hacen inserciones y actualizaciones con una base de fuego envuelta

    para la parte de indexación básicamente la función:

    1. JSON stringifica un documento.
    2. elimina todos los nombres de propiedad y JSON para alejar solo los datos (regex).
    3. elimina todas las tags xml (por lo tanto, también html) y los atributos (recuerda la guía anterior, “los datos no deberían estar en atributos xml”) para dejar solo el texto puro si xml o html estaban presentes.
    4. elimina todos los caracteres especiales y los sustituye con espacio (expresiones regulares)
    5. sustituye todas las instancias de espacios múltiples con un espacio (regex)
    6. se divide en espacios y ciclos:
    7. para cada palabra se agregan refs 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”
    8. 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 éxitos