【发布时间】:2019-03-08 16:38:17
【问题描述】:
我正在尝试按模式对 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 集合上执行模式过滤器有任何其他想法吗?
【问题讨论】:
-
存储搜索词是否更好是主观的。但它绝对可以工作。事实上,我们的一位工程师最近创建了一个在 Firestore 中存储三元组的搜索。顺便说一句:您的搜索词实际上也可以通过 Firestore 的内置搜索运算符找到:
db.collection("brands").where("name", ">=", "adi").where("name", "<=", "adidas") -
@FrankvanPuffelen 嗨,Puf!我们在哪里可以找到这个存储三元组的搜索?
-
沿着完全相同的路径走下去,跳过了 1 和 3(因为我们需要完全控制并且它必须扩展),尝试了 Algolia 和 ElasticSearch。最终,在 SSR 上遇到了与 Algolia 相关的问题,然后尝试了 ElasticSearch 方法——到目前为止它进展顺利。我还不确定成本,因为我们仍在进行少量开发,但如果您对 Algolia 方法感兴趣,我写了一篇文章:link.medium.com/NNg0I3Usi1
标签: firebase google-cloud-firestore full-text-search