javascript - from - ¿Cómo realizar la operación sql "LIKE" en firebase?
get data from firebase javascript (3)
Estoy usando firebase para el almacenamiento de datos. La estructura de datos es así:
products:{
product1:{
name:"chocolate",
}
product2:{
name:"chochocho",
}
}
Quiero realizar una operación de autocompletar 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 "chocolate" 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 memoria para una gran base de datos. Entonces, ¿cómo puedo ejecutar sql LIKE?
Gracias
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.
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 texto. Luego guarda los contenidos en mongodb.
Aunque me encanta y recomiendo la búsqueda elástica de la madurez del proyecto, lo mismo se puede hacer sin otro servidor, usando solo la base de datos de firebase. Eso es lo que quiero decir: ( https://github.com/metaschema/oxyzen )
para la parte de indexación básicamente la función:
- JSON stringifica un documento.
- elimina todos los nombres de propiedad y JSON para dejar solo los datos (regex).
- elimina todas las etiquetas 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.
- elimina todos los caracteres especiales y los sustituye con espacio (expresiones regulares)
- sustituye todas las instancias de espacios múltiples con un espacio (regex)
- se divide en espacios y ciclos:
- 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"
- 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
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 incluirá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 crear un almacén de datos en tiempo real), muy subestimado y una característica crítica de su aplicación, no una que desee ad hoc o incluso depender de alguien como Firebase para que la proporcione en su nombre. . Por lo general, es más sencillo emplear una herramienta escalable de terceros para gestionar la indexación, la búsqueda, la coincidencia de etiquetas / patrones, la lógica difusa, las clasificaciones ponderadas, etc.
El blog de Firebase presenta una publicación de blog sobre la indexación 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í.