繁体   English   中英

具有错字容忍、计数、用户特定等功能的列表的高级过滤?

[英]Advanced filtering of a list with typo-tolerance, counting, user-specific etc.?

我正在构建一个 Android 应用程序,稍后可能还会构建一个 iOS 版本的应用程序和一个 Web 应用程序。 我有一个列表,例如以这种方式:

城市名称 状态 计数器点击 更多栏目
达拉斯 德克萨斯州 4
波士顿 马萨诸塞州 3
纽约市 纽约 1
旧金山 加利福尼亚州 3
圣地亚哥 加利福尼亚州 3
西雅图 华盛顿 10
博伊西 爱达荷州 0

我正在寻找如何满足以下要求的解决方案:

  • 该列表及其数据始终是最新的,并在用户在线时从后端系统 (Google Firebase) 传输。
  • 该解决方案需要在 iOS / Android 设备上运行,如果可能,还需要在网站上运行。
  • 输入“D”只应显示“Dallas”。
  • 键入“S”西雅图、圣地亚哥和旧金山应按此顺序显示,因为“Counter Clicked”值(值越高,结果越相关)
  • 在以“S”开头的单词之后,输入“S”也应按此顺序(关于“Counter Clicked”)显示达拉斯、波士顿、博伊西,因为它们在单词中包含字母“S”。
  • “点击计数器”按用户处理。 因此可以选择城市名称,每次用户选择城市名称时,“点击计数器”应增加 1。
  • 过滤器服务应该是离线准备好的,所以应该在设备上处理“Counter Clicked”。 我不太确定将数据上传回 Firebase 后端服务器是否有意义,您怎么看?
  • 有错字容忍度会很棒。 因此,例如键入“Bostn”或“Sen”(一个字母的容差)“Boston”或“San ...”应显示。
  • 我还将有可能拥有一个方面过滤器,以便我可以在输入美国“州”之一之前进行过滤。

如果市场上有专业的解决方案,我对它感兴趣,否则,我需要为自己构建它。

我正在构建一个 Android 应用程序,稍后可能还会构建一个 iOS 版本的应用程序和一个 Web 应用程序。

您可以使用Firebase实现这一目标,因为:

Firebase 是由 Google 开发的用于创建移动(iOS 和 Android)和 Web 应用程序的平台。

我正在寻找如何满足以下要求的解决方案

为了回答您的问题,我将使用Cloud Firestore ,它是:

Cloud Firestore 是一个灵活、可扩展的数据库,用于 Firebase 和 Google Cloud 的移动、网络和服务器开发。 与 Firebase 实时数据库一样,它通过实时侦听器使您的数据在客户端应用程序之间保持同步,并为移动设备和 Web 提供离线支持,因此您可以构建响应式应用程序,无论网络延迟或互联网连接如何。

让我们开始吧:

该列表及其数据始终是最新的,并在用户在线时从后端系统 (Google Firebase) 传输。

您的答案就在上面,“它通过实时侦听器使您的数据在客户端应用程序之间保持同步”。 因此,您的数据将始终是最新的。

该解决方案需要在 iOS / Android 设备上运行,如果可能,还需要在网站上运行。

它将,因为 Firebase 是一个跨平台的解决方案。

输入“D”只应显示“Dallas”。

您可以通过使用 Query 的startAt()方法以非常简单的方式实现这一点:

创建并返回一个新的查询,该查询从与查询顺序相关的提供的字段开始。

所以你的查询应该是这样的代码:

ref.collection("cities").orderBy("cityName").startAt(name).endAt(name + "\uf8ff");

您还可以查看文档,并从以下文章中查看我的答案:

键入“S”西雅图、圣地亚哥和旧金山应按此顺序显示,因为“Counter Clicked”值(值越高,结果越相关)

要解决这个问题,您可以使用 Query 的orderBy(String field, Query.Direction direction)方法:

创建并返回一个新的 Query,该 Query 额外按指定字段排序,可选择按降序而不是升序。

因此,您可以根据“点击计数器”的数量显示这些城市。

在以“S”开头的单词之后,输入“S”也应按此顺序(关于“Counter Clicked”)显示达拉斯、波士顿、博伊西,因为它们在单词中包含字母“S”。

不幸的是,公司的FireStore支持全文搜索。 关于Cloud Firestore 中全文搜索的官方文档是最新的,代表 Algolia。

对于 Android,请参阅我在以下帖子中的回答:

要么:

“点击计数器”按用户处理。 因此可以选择城市名称,每次用户选择城市名称时,“点击计数器”应增加 1。

这可以使用FieldValue.increment(1)非常简单地实现,如我在以下帖子中的回答中所述:

过滤器服务应该是离线准备好的,所以应该在设备上处理“Counter Clicked”。 我不太确定将数据上传回 Firebase 后端服务器是否有意义,您怎么看?

根据有关离线访问数据的官方文档:

Cloud Firestore 支持离线数据持久化。 对于 Android 和 iOS,默认启用离线持久化。 对于 Web,默认情况下禁用离线持久性。 要启用持久性,请调用 enablePersistence 方法。

所以您支持三个平台,是的,将数据上传到服务器是有意义的,因为这样您将始终拥有一致的数据。

有错字容忍度会很棒。 因此,例如键入“Bostn”或“Sen”(一个字母的容差)“Boston”或“San ...”应显示。

Firestore 内置的任何东西都无法帮助您解决这个问题。 您可以做的是创建一个数组类型的附加字段并在其中搜索。 所以该数组可能有“Bostn”或“Bston”之类的拼写错误。

我还将有可能拥有一个方面过滤器,以便我可以在输入美国“州”之一之前进行过滤。

这也不是已经内置的 Firestore,但您可以肯定地实现类似的东西。 您很可能会考虑定义一些过滤器并在输入之前使用它们。

如果市场上有专业的解决方案,我对它感兴趣,否则,我需要为自己构建它。

Firebase 肯定可以帮助您实现您想要的,所以我希望我能够为此提供最佳解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM