2013-12-23 73 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:你的應用程序與客戶端搜索一下。