我知道firebase中没有WHERE
子句。但是,我们如何在firebase中实现模式搜索,就像我们可以在LIKE
运算符中使用SQL一样。firebase:在firebase中执行模式搜索
我们如何在firebase中实现以下sql查询?
SELECT * FROM Customers WHERE City LIKE 's%';
我知道firebase中没有WHERE
子句。但是,我们如何在firebase中实现模式搜索,就像我们可以在LIKE
运算符中使用SQL一样。firebase:在firebase中执行模式搜索
我们如何在firebase中实现以下sql查询?
SELECT * FROM Customers WHERE City LIKE 's%';
的近的解决方案是创建一个由市中服务器端索引(或任何其他领域,你想通过搜索)您的数据的索引脚本的NodeJS。
这将不完全复制LIKE
的行为,但它可以容易地查询城市名称,这可能会消除对该行为的需要。
这通过写一个的NodeJS简单的服务器端脚本典型的做法。想象一下你的用户数据存储在/users/data
中的场景。你的脚本看起来像这样。
var ref = new Firebase("<Your Firebase>.firebaseio.com");
// A Firebase ref where all our users are stored
var userDataRef = ref.child('users/data');
// A Firebase ref which is where we store our index
var byCityRef = ref.child("users/byCity");
// Then bind to users/data so we can index each user as they're added
userDataRef.on("child_added", function (snapshot) {
// Load the user details
var user = snapshot.val();
// Use the snapshot name as an ID (i.e. /users/data/Tim has an ID of "Tim")
var userID = snapshot.name();
// Push the userID into users/byCity/{city}
byCityRef.child(user.city).push(userID);
});
这个脚本会创建一个这样的结构:
{
"users": {
"data": {
"Tim": {"hair": "red", "eyes": "green", "city": "Chicago"}
},
"byCity": {
"Chicago": {
"-asd09u12": "Tim"
}
}
}
}
一旦我们索引我们的数据,查询反对它很简单,可以通过两个简单的做脚步。
var ref = new Firebase("<Your Firebase>.firebaseio.com");
var userDataRef = ref.child('users/data');
var byCityRef = ref.child('users/byCity')
// Load children of /users/byCity/Chicago
byCityRef.child('Chicago').on("child_added", function (snapshot) {
// Find each user's unique ID
var userID = snapshot.val();
// Then load the User's data from /users/data/{ID}
userDataRef.child(userID).once(function (snapshot) {
// userID = "Tim"
// user = {"hair": "red", "eyes": "green", "city": "Chicago"}
var user = snapshot.val();
});
});
现在您拥有近乎实时的Firebase加载速度和强大的查询功能!
你不行。您需要手动枚举您的对象并搜索自己。对于可能没问题的小数据集。但是你会用更大的数据集来烧录带宽。
Firebase支持使用优先级的一些有限查询功能,但仍然不是您要求的。
他们不支持这种广泛查询的原因是因为它们针对速度进行了优化。您应该考虑另一种更适合搜索的服务,如弹性搜索或传统的RDBMS。
您仍然可以将firebase与其他系统一起使用,以充分利用其优势 - 接近实时的对象提取和同步。
这不是一个解决方案,但现实... –
我是在同一时间,实现在他们的网站 “的posibility围绕火力搜索”,你有两个有趣的帖子:
对于基本querys(如果没有enouth,见第2部分):
1部分:https://www.firebase.com/blog/2013-10-01-queries-part-one.html
第2部分:https://www.firebase.com/blog/2014-01-02-queries-part-two.html
在第2部分,谈谈如何实现像SQL就像%任何%' 在恢复,火单独的基础对复杂查询并不好,然后推荐使用elasticsearch:elasticsearch.org。 对我来说有点困惑,需要很多服务来做一些简单的事情,比如找东西。
Elasticsearch有很多的工具,真的很有趣 你posibilly需要
1:一个的NodeJS脚本在同一台服务器上运行
2:一个elasticsearch服务运行
3:你的应用程序与客户端搜索一下。
伟大的答案abe!大约下周我们还会在[博客](https://www.firebase.com/blog/)上发布关于上下文搜索(LIKE)的文章! – Kato
这怎么能在客户端完全完成?我的后端不是写在Node中的,但是如果我把你的Node脚本放在客户端上,它会使索引逻辑执行很多次(每个客户端在线) – parliament