按模式搜索 Cloud Firestore 集合

Search by pattern on Cloud Firestore collection

我正在尝试按模式对 Firestore 集合执行过滤。例如,在我的 Firestore 数据库中,我有一个名为 adidas 的品牌。用户将有一个搜索输入,其中键入 "adi"、"adid"、"adida" 或 "adidas" returns adidas 文档。我指出了几个解决方案来做到这一点:


1.获取所有文档并进行前端过滤

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

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


2. Elasticsearch or Algolia

的使用

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


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

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

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

以便可以使用 :

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

所以我有几个问题:

恕我直言,第一个解决方案绝对不是一个选项。下载整个集合以在客户端搜索字段根本不切实际,而且成本也很高。

第二个选项是最佳选项,因为它可以帮助您在整个 Cloud Firestore 数据库中启用全文搜索。值不值得用,由你决定。

What do you think about the pertinence and the efficiency of this 3rd solution?

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

Do you have any other idea for performing a pattern filters over a Firestore collection?

如果您有兴趣只从一个词中获取结果并使用品牌的起始字母作为模式,我建议您使用如下查询的更好解决方案:

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

在这种情况下,aad 之类的搜索将完全正常。除此之外,不需要创建任何其他数组。所以文档写入会比较少。