【发布时间】:2014-01-11 13:07:25
【问题描述】:
我知道 firebase 中没有 WHERE 子句。但是我们如何在 firebase 中实现模式搜索,就像在 SQL 中使用 LIKE 运算符一样。
我们如何在 firebase 中实现以下 sql 查询?
SELECT * FROM Customers WHERE City LIKE 's%';
【问题讨论】:
我知道 firebase 中没有 WHERE 子句。但是我们如何在 firebase 中实现模式搜索,就像在 SQL 中使用 LIKE 运算符一样。
我们如何在 firebase 中实现以下 sql 查询?
SELECT * FROM Customers WHERE City LIKE 's%';
【问题讨论】:
一个接近的解决方案是在服务器端 NodeJS 脚本中创建由 City(或您想要搜索的任何其他字段)索引的数据索引。
这将不完全复制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 与其他系统一起使用,以利用其优势 - 接近实时的对象获取和同步。
【讨论】:
同时,我正在实现“在火力基地周围搜索的可能性” 在他们的网站上,您有两个有趣的帖子:
对于基本查询(如果不是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部分,谈谈如何实现一个like sql 'like %anything%' 在简历中,Firebase 本身并不适合复杂的查询,然后建议与 elasticsearch 互补使用:elasticsearch.org。 对我来说是一些困惑,需要很多服务来做一些简单的事情,比如 find by something。
Elasticsearch 有很多非常有趣的工具 你可能需要
1:在同一台服务器上运行的nodejs脚本
2:正在运行的弹性搜索服务
3:您的应用与客户端一起搜索。
【讨论】: