Firebase 和索引/搜索

Posted

技术标签:

【中文标题】Firebase 和索引/搜索【英文标题】:Firebase and indexing/search 【发布时间】:2012-05-20 12:18:02 【问题描述】:

我正在考虑将 Firebase 用于人们应该对数千个对象的集合使用全文搜索的应用程序。我喜欢提供仅客户端应用程序的想法(不必担心托管数据),但我不确定如何处理搜索。数据将是静态的,因此索引本身并不是什么大问题。

我假设我需要一些额外的服务来运行查询并返回 Firebase 对象句柄。我可以在某个固定位置启动这样的服务,但我不得不担心它的可用性和可扩展性。虽然我预计此应用不会有太多流量,但它可能会在几千个并发用户时达到峰值。

架构思想?

【问题讨论】:

【参考方案1】:

从长远来看,Firebase 可能有更高级的查询,所以希望它能直接支持这类事情,而无需您做任何特别的事情。在那之前,您有几个选择:

    编写服务器代码来处理搜索。 最简单的方法是运行一些负责索引/搜索的服务器代码,正如您所提到的。 Firebase 有一个 Node.JS 客户端,因此这是一种将服务连接到 Firebase 的简单方法。所有数据传输仍然可以通过 Firebase 进行,但您可以编写一个 Node.JS 服务,在 Firebase 中的某个指定位置监视客户端“搜索请求”,然后通过将结果集写回 Firebase 来“响应”,用于客户消费。 将索引存储在 Firebase 中,客户端会自动更新它。如果你想变得非常聪明,你可以尝试实现一个无服务器方案,客户端在写入数据时自动为其建立索引......所以全文搜索的索引将存储在 Firebase 中,当客户端将新项目写入集合时,它还将负责适当地更新索引。为了进行搜索,客户端将直接使用索引来构建结果集。这实际上对于您想要索引存储在 Firebase 中的复杂对象的一个​​字段的简单情况很有意义,但对于全文搜索,这可能会非常麻烦。 :-) 将索引存储在 Firebase 中,服务器代码对其进行更新。您可以尝试一种混合方法,将索引存储在 Firebase 中并由客户端直接使用来进行搜索,而不是让客户端更新索引,只要将新项目添加到集合中,您就会拥有更新索引的服务器代码。这样,当您的服务器关闭时,客户端仍然可以搜索数据。在您的服务器赶上索引之前,它们可能会得到陈旧的结果。

在 Firebase 提供更高级的查询之前,如果您愿意运行一些服务器代码,#1 可能是您最好的选择。 :-)

【讨论】:

糟糕。只需重新阅读您的评论,即您的数据是静态的。在这种情况下,选项#2 是不必要的,选项#3 变得更容易。您仍然需要弄清楚如何构建全文搜索索引,将其存储在 Firebase 中,并让客户端直接查询它,但应该是完全可行的。 感谢您确认我没有遗漏一些明显的东西。我认为#1 可能是正确的方法——在 javascript 中重新实现全文索引似乎不是很好地利用我的时间 :-) 查看lunrjs.com 以获得完整的基于 JS 的全文索引解决方案。 这仍然是 firebase 全文搜索的最新技术吗?即与firebase和搜索索引器交互的服务(a la github.com/firebase/flashlight) #1 的一个很好的实现见github.com/firebase/flashlight 它与 ElasticSearch 集成以提供 Firebase 数据的全文搜索功能。【参考方案2】:

Google 当前进行全文搜索的方法似乎是与 Algolia 或 BigQuery 与 Cloud Functions for Firebase 同步。

这是 Firebase 的 Algolia Full-text search integration example,以及可以扩展以支持完整搜索的 BigQuery integration example。

【讨论】:

以上是关于Firebase 和索引/搜索的主要内容,如果未能解决你的问题,请参考以下文章

Swift Firebase UISearchController 索引超出范围

如何使用 Cloud Function 将数据从 Firebase Firestore 索引到 Elastic App Search?

我可以将 Firebase Cloud Functions 用于搜索引擎吗?

Firebase和填充单元格的“索引超出范围”

FIREBASE 警告:使用未指定的索引。您的数据将在客户端下载和过滤

致命错误:索引超出范围 - Swift 3 和 Firebase