firebase firebase-realtime-database database nosql

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:

  1. JSON stringifica un documento.
  2. elimina todos los nombres de propiedad y JSON para alejar solo los datos (regex).
  3. 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.
  4. elimina todos los caracteres especiales y los sustituye por espacios (expresiones regulares)
  5. sustituye todas las instancias de múltiples espacios con un espacio (regex)
  6. se divide en espacios y ciclos:
  7. 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"
  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 hits