Flutter Firebase - 搜索包含字符串的文档

Posted

技术标签:

【中文标题】Flutter Firebase - 搜索包含字符串的文档【英文标题】:Flutter Firebase - Search for documents which contain a string for 【发布时间】:2021-07-06 07:13:32 【问题描述】:

我有一个关于从 Google Cloud Firestore 检索具有我的 Flutter 项目中的特定参数的数据的请求。

我使用以下代码检查 Firebase 中的字符串是否等于用户执行的搜索查询:

var snapshot = await firestoreInstance.collection('categories/subcategory/items')
.where("parameter", isEqualTo: searchQuery).get()

如果用户准确键入存储在 Firestore 中的参数名称,则此方法有效。但我想要的是,如果只有部分 searchQuery 字符串存储在 Firestore 参数中,它也可以工作。

我在https://medium.com/flutterdevs/implement-searching-with-firebase-firestore-flutter-de7ebd53c8c9 上找到了解决方案。在文章中,创建了一个数组,其中包含对参数的所有可能搜索。但我认为这有点复杂,您必须在 Firestore 中生成大量新数据才能搜索文章。

有没有办法以更简单的方式做到这一点,以便您可以在 Flutter with Firebase 中将运算符用作“包含”而不是“isEqualTo”来处理请求?

【问题讨论】:

您可以根据需要使用第三方应用程序,例如 Algolia 为 example。 【参考方案1】:

试试这个:

var snapshot = await firestoreInstance
      .collection('categories/subcategory/items')
      .where(
        'parameter',
        isGreaterThanOrEqualTo: searchQuery,
        isLessThan: searchQuery.substring(0, searchQuery.length - 1) +
            String.fromCharCode(searchQuery.codeUnitAt(searchQuery.length - 1) + 1),
      )
      .get();

我根据你的例子来命名变量。

【讨论】:

您好,我尝试了您的代码,但问题是现在显示了太多不匹配的结果。例如,在输入搜索查询“Verlierer”后,显示名称为“Der mächtigste Verlierer der Welt”的文档是正确的。但也有其他职位,例如“Die neuen Spitzenkandidaten”显示的内容与原帖无关。你知道为什么会这样吗? 老实说,我什至想知道为什么您会得到“Der mächtigste Verlierer der Welt”,因为我只得到字段首字母与查询完全匹配的文档作为结果。例如,如果字段的值为“example”,则它仅在查询为“examp”或类似内容时才有效,但在查询为“xample”或“examplexx”时无效。请您提供源代码的对应sn-p吗? 我不得不承认我的方法远非完美。不过,我认为没有比 Medium 文章中解释的解决方案更好的解决方案了。也许你可以使用一些服务器端函数来处理这样的查询。抱歉,它不起作用:/ 你会在this question下找到一些有趣的方法! 非常感谢您的努力。我会看看另一个问题:)

以上是关于Flutter Firebase - 搜索包含字符串的文档的主要内容,如果未能解决你的问题,请参考以下文章

在 Flutter 中的 ListView 中搜索(使用 Firebase 中的数据)

flutter firebase 如何获取节点的所有子节点

Flutter:按字符搜索列表

如何在 Flutter Firebase 应用中搜索并向附近的人发送通知?

Flutter & firebase:我怎么能做一个“只包含来自”的查询

Firebase Query 不适用于 Flutter,如何解决?