2013-12-23 46 views

回答

14

理念

的近的解决方案是创建一个由市中服务器端索引(或任何其他领域,你想通过搜索)您的数据的索引脚本的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加载速度和强大的查询功能!

+0

伟大的答案abe!大约下周我们还会在[博客](https://www.firebase.com/blog/)上发布关于上下文搜索(LIKE)的文章! – Kato

+1

这怎么能在客户端完全完成?我的后端不是写在Node中的,但是如果我把你的Node脚本放在客户端上,它会使索引逻辑执行很多次(每个客户端在线) – parliament

4

你不行。您需要手动枚举您的对象并搜索自己。对于可能没问题的小数据集。但是你会用更大的数据集来烧录带宽。

Firebase支持使用优先级的一些有限查询功能,但仍然不是您要求的。

他们不支持这种广泛查询的原因是因为它们针对速度进行了优化。您应该考虑另一种更适合搜索的服务,如弹性搜索或传统的RDBMS。

您仍然可以将firebase与其他系统一起使用,以充分利用其优势 - 接近实时的对象提取和同步。

+0

这不是一个解决方案,但现实... –

1

我是在同一时间,实现在他们的网站 “的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:你的应用程序与客户端搜索一下。