Firebase: 在Firebase中实现模式搜索

5

我知道Firebase中没有WHERE子句。但是我们如何在Firebase中实现模式搜索,就像我们可以使用LIKE运算符在SQL中进行一样。

我们如何在Firebase中实现以下SQL查询?

SELECT * FROM table_name WHERE column_name LIKE 'pattern';
SELECT * FROM Customers WHERE City LIKE 's%';
3个回答

14

这个想法

一个近似的解决方案是在服务器端使用 NodeJS 脚本创建一个以城市(或其他您想要搜索的字段)为索引的数据索引。

虽然这并不完全复制 LIKE 的行为,但它可以通过城市名称轻松查询,这可能消除了对该行为的需求。

NodeJS脚本

通常可以通过编写一个简单的 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 近乎实时的加载速度,并具有强大的查询功能!


太棒了,Abe!我们也会在博客上发布关于上下文搜索(LIKE)的文章,大约在下周左右! - Kato
1
这个怎么能完全在客户端上完成呢?我的后端不是用Node写的,但是如果我把你的Node脚本放在客户端上,它会导致索引逻辑执行多次(每个在线客户端都要执行一次)。 - parliament

4
你不能这样做。你需要手动列举你的对象并自己搜索。对于小数据集来说可能还可以,但是对于更大的数据集来说会耗费带宽。
Firebase只支持使用优先级的一些有限查询能力,但仍然不符合你的要求。
他们不支持这样的广泛查询是因为他们被优化了速度。你应该考虑使用其他适合搜索的服务,如弹性搜索或传统关系型数据库管理系统。
你仍然可以将Firebase与其他系统一起使用,以利用其强大的实时对象提取和同步功能。

1
我同时正在实现“在Firebase周围搜索的可能性”,在他们的网站上,您有两篇有趣的帖子:
对于基本查询(如果不够,请参见第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 'like %anything%'的操作。 总之,仅使用Firebase无法处理复杂的查询,因此建议与elasticsearch一起使用:elasticsearch.org。 对我来说,这有点混乱,需要很多服务才能像查找某些东西这样简单。
Elasticsearch有很多非常有趣的工具,你可能需要:
1:在同一服务器上运行的nodejs脚本
2:运行的elasticsearch服务
3:具有客户端搜索功能的应用程序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接