¿Cómo realizar la operación sql "LIKE" en firebase?

Estoy usando firebase para el almacenamiento de datos. La estructura de datos es así:

products:{ product1:{ name:"choqueuete", } product2:{ name:"chochocho", } } 

Quiero realizar una operación de autocomplete para estos datos, y normalmente escribo la consulta de esta manera:

 "select name from PRODUCTS where productname LIKE '%" + keyword + "%'"; 

Entonces, para mi situación, por ejemplo, si el usuario escribe "cho", necesito traer "choqueuete" y "chochocho" como resultado. Pensé en poner todos los datos bajo el bloque de "productos", y luego hacer la consulta en el cliente, pero esto puede necesitar mucha memory para una gran database. Entonces, ¿cómo puedo ejecutar sql LIKE?

Gracias

Actualización: con el lanzamiento de Cloud Functions for Firebase, también hay otra manera elegante de hacer esto al vincular Firebase a Algolia a través de Functions . La compensación aquí es que las funciones / Algolia es prácticamente cero mantenimiento, pero probablemente a un costo mayor que roll-your-own en Node.

No hay búsquedas de contenido en Firebase actualmente. Muchos de los escenarios de búsqueda más comunes, como la búsqueda por atributo, se includeán en Firebase a medida que la API continúe expandiéndose.

Mientras tanto, ciertamente es posible hacer crecer el tuyo. Sin embargo, la búsqueda es un tema extenso (piense en la creación de un almacén de datos en time real), muy subestimado y una característica fundamental de su aplicación, no una que desee ad hoc o que dependa de alguien como Firebase para proporcionarla en su nombre. . Por lo general, es más sencillo emplear una herramienta escalable de terceros para gestionar la indexing, la búsqueda, la coincidencia de tags / patrones, la lógica difusa, las clasificaciones ponderadas, etc.

El blog de Firebase presenta una publicación de blog sobre la indexing con ElasticSearch, que describe un enfoque directo para integrar un motor de búsqueda rápido, pero extremadamente potente, en el back-end de Firebase.

Esencialmente, se hace en dos pasos. Controle los datos e indexe:

 var Firebase = require('firebase'); var ElasticClient = require('elasticsearchclient') // initialize our ElasticSearch API var client = new ElasticClient({ host: 'localhost', port: 9200 }); // listen for changes to Firebase data var fb = new Firebase('<INSTANCE>.firebaseio.com/widgets'); fb.on('child_added', createOrUpdateIndex); fb.on('child_changed', createOrUpdateIndex); fb.on('child_removed', removeIndex); function createOrUpdateIndex(snap) { client.index(this.index, this.type, snap.val(), snap.name()) .on('data', function(data) { console.log('indexed ', snap.name()); }) .on('error', function(err) { /* handle errors */ }); } function removeIndex(snap) { client.deleteDocument(this.index, this.type, snap.name(), function(error, data) { if( error ) console.error('failed to delete', snap.name(), error); else console.log('deleted', snap.name()); }); } 

Consulta el índice cuando quieras hacer una búsqueda:

 <script src="elastic.min.js"></script> <script src="elastic-jquery-client.min.js"></script> <script> ejs.client = ejs.jQueryClient('http://localhost:9200'); client.search({ index: 'firebase', type: 'widget', body: ejs.Request().query(ejs.MatchQuery('title', 'foo')) }, function (error, response) { // handle response }); </script> 

Hay un ejemplo y una lib de terceros para simplificar la integración, aquí.

Creo que puedes hacer:

 admin .database() .ref('/vals') .orderByChild('name') .startAt('cho') .endAt("cho\uf8ff") .once('value') .then(c => res.send(c.val())); 

esto encontrará vals cuyo nombre comienza con cho.

fuente

La solución de búsqueda elástica básicamente se une para agregar set del y ofrece un get by que puede realizar búsquedas de text. Luego guarda los contenidos en mongodb.

Si bien me gusta y recomiendo la búsqueda elástica de la madurez del proyecto, lo mismo se puede hacer sin otro server, utilizando solo la database de firebase. Eso es lo que quiero decir: ( https://github.com/metaschema/oxyzen )

para la parte de indexing básicamente la function:

  1. JSON stringifica un documento.
  2. elimina todos los nombres de propiedad y JSON para dejar solo los datos (regex).
  3. elimina todas las tags xml (por lo tanto, también html) y los attributes (restring la guía anterior, "los datos no deberían estar en attributes xml") para dejar solo el text 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 database 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 documentos directamente en las palabras niño. las búsquedas de palabras múltiples se implementan usando éxitos