来自完整字符串的Cloud Firestore查询阵列

时间:2019-06-13 16:12:19

标签: javascript firebase google-cloud-firestore

我在Firebase中有一个集合,其中包含多个记录,每个记录包含一个名称和该记录的“关键字”的字符串数组。下面的例子。

Record_1
   name: Record 1
   keywords: [apple, orange, raspberry]
Record_2
   name: Record 2
   keywords: [orange, strawberry, raspberry]
Record_3
   name: Record 3
   keywords: [apple, pear, strawberry]


//Search String: “I would like an apple and an orange.”

//Returns results: Record_1 and Record_2

我想从文本字段中的用户搜索字符串中运行搜索。不幸的是,该字符串可能包含任何关键字数组中都不存在的单词。

我想从搜索字符串中返回具有所有匹配关键字的记录,但不限制是由于数组中搜索字符串中不存在的单词。请参见上面的示例“搜索字符串”和“返回结果”。

有什么想法吗? 谢谢

2 个答案:

答案 0 :(得分:0)

如果要保持健全(不想为每个可能的组合运行查询),则使用常规的Cloud Firestore查询不可能

正如您正确指出的那样,如果要使用搜索字符串中的每个单词来查询array-contains,则不会得到任何结果,因为没有一个文档包含所有这样的来自搜索字符串的单词。

实际上,Cloud Firestore团队对此类高级案例进行了重新建议。该文档包含"Solutions" section,该文档提供了Cloud Firestore架构不支持的常见问题的解决方案。
在这种情况下,您需要考虑"Search" solution,它指向名为Algolia的第三方。

全面披露:我尚未“为自己设置此功能,以查看它需要多少工作,可能需要花费多少以及它是否可以按照我期望的方式工作”(引用Doug Stevenson)。我希望您自己考虑哪种解决方案最适合您的情况。

基本上,该服务使您可以将数据保存在其服务器上以从那里执行更高级的查询。 article from the documentation解释了如何进行设置。

Cloud Firestore本机替代

理论上,您可以从字符串中查询每个单词。您将运行一个循环,遍历所有单词并为每个单词执行array-contains。现在,您甚至可能要确保此操作不区分大小写。这将要求您至少运行原始数量很高的查询数量的两倍。此外,您将必须跟踪哪些文档与哪些查询匹配,以将它们组合到客户端。

答案 1 :(得分:0)

当前没有单个查询可以为您完成此操作。您将必须制作多个array_contains queries,其中一个用于您要查找的每个字符串。

collectionRef.where("keywords", "array-contains", "thing-to-look-for")

然后,您可以合并客户端上每个查询的结果,以删除所有重复项。