当前位置: 首页 > 知识库问答 >
问题:

在Cloud Firestore集合上按模式搜索

羊舌胡非
2023-03-14

我正在尝试对Firestore集合执行按模式筛选。例如,在我的Firestore数据库中,我有一个名为adidas的品牌。用户将有一个搜索输入,输入“ADI”、“ADID”、“Adida”或“Adidas”将返回adidas文档。我指出了几个解决方案来做到这一点:


1.获取所有文档并执行前端筛选

var brands = db.collection("brands");
filteredBrands = brands.filter((br) => br.name.includes("pattern"));

由于Firestore的定价,这个解决方案显然不是一个选项。此外,如果文档数量很高,执行请求可能会相当长。


2.使用Elasticsearch或Algolia

这可能很有趣。然而,我认为添加这些解决方案只支持模式搜索有点矫枉过正,而且这会很快变得昂贵。


3.创建对象时自定义searchname字段

所以我有这样的解决方案:在创建文档时,创建一个包含可能搜索模式数组的字段:

{
    ...
    "name":"adidas",
    "searchNames":[
        "adi",
        "adida",
        "adidas"
    ],
    ...
}

以便可以通过以下方式访问该文件:

filteredBrands = db.collection("brands").where("searchNames", "array-contains", "pattern");

所以我有几个问题:

  • 您认为第三种解决方案的针对性和效率如何?您认为这比使用第三方解决方案(如Elasticsearch或Algolia)好多少?
  • 对于在firestore集合上执行模式筛选,您有其他想法吗?

共有1个答案

夏英发
2023-03-14

IMHO,第一个解决方案肯定不是一个选项。下载一个完整的集合来在客户端搜索字段是不实际的,而且成本很高。

考虑到将帮助您在整个Cloud Firestore数据库中启用全文搜索的事实,第二个选项是最佳选项。由你来决定是否值得使用它。

您认为第三种解决方案的针对性和效率如何?

关于第三种解决方案,它可能有效,但这意味着即使品牌名称很长,也要创建一个可能的搜索模式数组。正如我在您的模式中看到的,您正在添加从第3个字母开始的可能的搜索模式,这意味着如果有人正在搜索ad,将不会找到任何结果。这个解决方案的缺点是,如果您有一个名为ASICSTiger的品牌,而用户正在搜索TIGTIGE,那么您最终将再次没有结果。

对于在Firestore集合上执行模式筛选,您有什么其他想法吗?

如果您有兴趣只从一个单词中得到结果,并使用品牌的醒目字母作为模式,我推荐您一个更好的解决方案,它使用如下所示的查询:

var brands = db.collection("brands");
brands.orderBy("name").startAt(searchName).endAt(searchName + "\uf8ff")

在这种情况下,类似aAD的搜索将非常好地工作。除此之外,将不需要创建任何其他数组。这样就会减少文档写入。

 类似资料:
  • 问题内容: 我想在mongodb中为每个集合使用多个模式,如何使用它。 当我尝试运行它时,它给了我这个错误: 错误: OverwriteModelError:编译后无法覆盖模型。 OverwriteModelError:编译后无法覆盖模型。 这是我的schema.js 问题答案: 在猫鼬中,您可以执行以下操作: 这两个模式将保存在“用户”集合中。 有关更多信息,您可以参考文档:http : //m

  • 我有一个带有搜索栏的表视图。当我将项目添加到另一个数组时,我能够使用NSPredicate搜索表视图: 现在,我想将集合放在一起,以便tableView DidSelectRowatingIndexPath能够使用category对象。 我像这样加载我的表视图: 如何让我的NSPredicate在收藏中搜索head。描述? 目前,我在运行上述代码时遇到此异常。

  • 我使用来自Confluent的Kafka Connect来使用Kafka流并以拼花格式写入HDFS。我正在1个节点中使用架构注册表服务,它运行良好。现在我想将模式注册表分发到集群模式以处理故障转移。关于如何实现这一点的任何链接或片段都将非常有用。

  • 应用内搜索 当应用内包含大量信息的时候,用户希望能够通过搜索快速地定位到特定内容。 最基本的搜索包括以下过程: 打开一个搜索文本框 输入查询并提交 显示搜索结果集 然而,可以通过加入一些增强功能来显著提升搜索体验: 启用语音搜索 提供基于用户最近历史查询的搜索建议,即使是在输入查询之前 提供满足应用数据中实际结果的自动完成搜索建议 应用内搜索中有两种主要的模式:持久性搜索(persistent s

  • 我有:一个实体有一个的集合,每个阶段都有一个的集合。Stage项可以有几种类型,我在JPA/Hibernate中使用它们作为带有鉴别器列的继承策略。 我需要lucene查询返回在类型a的阶段项(类中的字段)中具有特定细节的请求。我无法让hibernate搜索查看子类中的字段。 因此这个lucene查询不起作用(返回0个结果): 但基于中的字段进行搜索有效:

  • 本文向大家介绍vim 搜索模式,包括了vim 搜索模式的使用技巧和注意事项,需要的朋友参考一下 示例 在搜索文件时,Vim支持使用正则表达式。 表示您希望执行搜索的字符是/。 您可以执行的最简单的搜索如下 这将在整个文件中搜索的所有实例if。但是,我们的搜索if实际上是一个正则表达式,它将匹配单词的任何出现(if包括其他单词内部的匹配)。 举例来说,我们的搜索会说所有的下列单词匹配我们的搜索:if