2012-05-11 140 views
26

我正在考慮將Firebase用於應該讓人們對幾千個對象的集合使用全文搜索的應用程序。我喜歡提供客戶端應用程序的想法(不必擔心託管數據),但我不知道如何處理搜索。數據將是靜態的,所以索引本身並不是什麼大問題。Firebase和索引/搜索

我假設我需要一些額外的服務來運行查詢並返回Firebase對象句柄。我可以在某個固定位置啓動這樣的服務,但是我不得不擔心其可用性和可擴展性。雖然我不期望這個應用的流量過大,但它可以在幾千個併發用戶達到峯值。

建築思想?

回答

27

長期來看,Firebase將會有更高級的查詢,所以希望它能夠直接支持這類事情,而不需要做任何特別的事情。在此之前,您有幾種選擇:

  1. 編寫處理搜索的服務器代碼。最簡單的方法是運行一些負責索引/搜索的服務器代碼,正如你所提到的。 Firebase有一個Node.JS客戶端,因此這將是一種將服務連接到Firebase的簡單方法。所有數據傳輸仍可能通過Firebase發生,但是您需要編寫一個Node.JS服務,以監視Firebase中某個指定位置的客戶「搜索請求」,然後通過將結果集寫回Firebase進行「響應」客戶端消費。
  2. 將索引存儲在Firebase中,客戶端自動更新索引。如果您想變得非常聰明,可以嘗試實施無服務器方案,客戶端在寫入數據時自動爲其編制索引...因此,全文搜索的索引將存儲在Firebase中,而當客戶端將新項目寫入集合,它將負責適當地更新索引。爲了進行搜索,客戶端將直接使用索引來構建結果集。對於想要索引存儲在Firebase中的複雜對象的一個​​字段的簡單情況,這對於全文搜索來說實際上是很有意義的,這可能會非常粗糙。 :-)
  3. 將索引存儲在Firebase中,服務器代碼將其更新。您可以嘗試一種混合方法,將索引存儲在Firebase中,並由客戶端直接使用來執行搜索,但不是讓客戶端更新索引,而是讓服務器代碼在每次將新項目添加到採集。這樣,客戶端仍然可以在服務器關閉時搜索數據。他們可能會得到陳舊的結果,直到你的服務器趕上索引。

在Firebase進行更高級的查詢之前,如果您願意運行一點服務器代碼,#1可能是您最好的選擇。 :-)

+1

糟糕。只需重新閱讀您的評論,即您的數據是靜態的。在這種情況下,選項#2不是必需的,選項#3變得更容易。您仍然必須弄清楚如何構建全文搜索索引,將其存儲在Firebase中,並讓客戶直接查詢,但應該完全可行。 –

+0

感謝您確認我沒有錯過任何明顯的事情。我認爲#1可能是正確的路要走 - 在JavaScript中重新實現全文索引似乎不能很好地利用我的時間:-) –

+0

請訪問http://lunrjs.com/用於完整的基於JS的全文索引解決方案。 – Nemo