【发布时间】:2018-01-10 13:05:33
【问题描述】:
如何使用 Firebase 进行基本的自动完成/文本预览?
例如,假设有一个由 Firebase 支持的博客,博主可以在其中使用标签标记帖子。当博主正在标记新帖子时,如果他们能看到与他们输入的前几次击键相匹配的所有当前存在的标签,将会很有帮助。因此,如果“博客”、“黑色”、“炽热的马鞍”和“牛头犬”是标签,如果用户键入“bl”,他们会得到前三个,但不会得到“牛头犬”。
我最初的想法是,我们可以将标签设置为标签的优先级,并使用 startAt,这样我们的查询看起来像:
fb.child('tags').startAt('bl').limitToFirst(5).once('value', function(snap) {
console.log(snap.val())
});
但这也会返回“斗牛犬”作为结果之一(不是世界末日,但也不是最好的)。使用 startAt('bl').endAt('bl') 不会返回任何结果。有没有其他方法可以做到这一点?
(我知道一种选择是我们可以使用搜索服务器,例如 ElasticSearch,用于 -- 参见 https://www.firebase.com/blog/2014-01-02-queries-part-two.html -- 但我希望尽可能多地保留在 Firebase 中。)
编辑
正如加藤建议的那样,这是一个具体的例子。我们有 20,000 名用户,他们的姓名是这样存储的:
/users/$userId/name
通常,用户会按名称查找其他用户。当用户查找他们的好友时,我们想要一个下拉列表来填充名称以搜索者输入的字母开头的用户列表。因此,如果我输入“Ja”,我希望在下拉列表中看到“Jake Heller”、“jake gyllenhaal”、“Jack Donaghy”等。
【问题讨论】:
-
我们在这里讨论了多少条记录?我们是在实施 Google 搜索还是现实的客户端自动完成?
-
好问题。对于我们正在考虑进行自动完成的某些事情,有 200 万多条记录。对于其他人,可能只有 100(网站上的不同标签)到 20,000(网站上注册用户的名称)的数量级。
-
我想我知道你可能会用这个去哪里。我们绝对可以做一个 startAt() 和 limit() 然后在客户端过滤掉错误的结果(比如我的例子中的“斗牛犬”)。我认为对于 FB 中任何大小的对象,只要我们使用 limit(),这应该是高性能的(对吗?)。这不如让 Firebase 为我们处理所有事情好,但仍然是一种选择。
-
对于这样一个通用集合,以 SO 格式回答这个问题非常困难。如果您提供一个具体的案例来首先解决,我可以帮助您处理细节。您提到的每一个对于“最高性能”来说可能都不同。我们可以排除 200 万+ 绝对是 ElasticSearch/Flashlight 项目。 500k 或更少,我只是抓住它们并过滤客户端。 20k 个名字是什么,400k 也许?在这里,我可能只是按名称的第一个字母进行索引或优先级排序,然后从那里过滤客户端,根据需要进行优化。选择一个,我们可以解决它。
-
另外,请注意,您可以使用Flashlight 获取 ElasticSearch 结果,并且仍然只与 Firebase 交互,让您保持简单。
标签: autocomplete firebase