我正在使用firebase进行数据存储。数据结构如下:
products:{
product1:{
name:"chocolate",
}
product2:{
name:"chochocho",
}
}
我想对这些数据执行自动完成操作,通常我会像这样编写查询:
"select name from PRODUCTS where productname LIKE '%" + keyword + "%'";
因此,对于我的情况,例如,如果用户输入“cho”,我需要同时带上“chocolate”和“chochocho”。我考虑将所有数据放在“产品”块下,然后在客户端进行查询,但这可能需要大量数据库的内存。那么,我该如何执行sql LIKE操作呢?
由于
答案 0 :(得分:25)
更新:随着Cloud Functions for Firebase的发布,linking Firebase to Algolia via Functions还有另一种优雅的方式来实现这一目标。这里的权衡是函数/ Algolia几乎没有维护,但可能比在Node中使用自己的滚动成本更高。
目前Firebase中没有内容搜索。许多更常见的搜索方案(例如按属性搜索)将随着API的不断扩展而融入Firebase。
与此同时,你自己也可以成长。但是,搜索是一个很大的主题(想想创建一个实时数据存储大),被大大低估,并且是您的应用程序的关键功能 - 不是您想要临时或甚至依赖像Firebase这样的人代表您提供的。因此,使用可扩展的第三方工具处理索引,搜索,标记/模式匹配,模糊逻辑,加权排名等等,通常更为简单。
Firebase博客提供了一个blog post on indexing with ElasticSearch,其中概述了将快速但极其强大的搜索引擎集成到Firebase后端的直接方法。
基本上,它分两步完成。监控数据并将其编入索引:
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());
});
}
要进行搜索时查询索引:
<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>
There's an example, and a third party lib to simplify integration, here.
答案 1 :(得分:11)
我相信你可以做到:
admin
.database()
.ref('/vals')
.orderByChild('name')
.startAt('cho')
.endAt("cho\uf8ff")
.once('value')
.then(c => res.send(c.val()));
这将找到名称以cho开头的val。
答案 2 :(得分:1)
弹性搜索解决方案基本上绑定添加set del并提供一个get by wich,你可以完成文本搜索。 然后将内容保存在mongodb中。
虽然我喜欢并重新考虑弹性搜索项目的成熟度,但是只使用firebase数据库就可以在没有其他服务器的情况下完成同样的工作。 这就是我的意思: (https://github.com/metaschema/oxyzen)
对于索引部分基本上是函数:
在oxyzen实现中,文档的后续更新ACTUALLY读取索引并对其进行更新,删除不再匹配的单词,并添加新单词。
随后搜索单词可以直接在单词child中查找文档。使用命中
实现多个单词搜索答案 3 :(得分:1)
可以在Firebase上进行SQL“ LIKE”操作
let node = await db.ref('yourPath').orderByChild('yourKey').startAt('!').endAt('SUBSTRING\uf8ff').once('value');
答案 4 :(得分:-1)
此查询对我有用,看起来像下面的MySQL语句
select * from StoreAds where University Like %ps%;
query = database.getReference().child("StoreAds").orderByChild("University").startAt("ps").endAt("\uf8ff");