我想通过一个查询来实现使用云Firestore的搜索功能,但没有得到任何与获取数据相关的查询。我在谷歌上搜索了很多东西,但到处都是唯一的建议是首先从云Firestore获取所有数据,然后在本地搜索。我检查了查询中的where条件,但没有找到任何条件,如“开始于”等。
我想按名称参数搜索。
nbnkbykc1#
Firestore没有内置的全文搜索功能。我常用的两个查询操作符是:
isEqualTo:
isGreaterThanOrEqualTo:
isLessThanOrEqualTo:
startAt:
endAt:
例如,若要搜索所有name以al开头的文档,可以使用collectionRef.where("name", isGreaterThanOrEqualTo: "al").where("name", isLessThanOrEqualTo: "al\uf7ff")。这里的\uf7ff只是最后一个已知的Unicode字符,因此查询在处理完每个al后就停止返回结果。如果您需要任何其他文本搜索操作,则需要使用其他解决方案--例如记录为here的Algolia。
name
al
collectionRef.where("name", isGreaterThanOrEqualTo: "al").where("name", isLessThanOrEqualTo: "al\uf7ff")
\uf7ff
axzmvihb2#
这段代码在使用firestone flutter搜索文本时非常有帮助
StreamBuilder( stream: ( searchtxt!= "" && searchtxt!= null)?FirebaseFirestore.instance.collection("addjop").where("specilization",isNotEqualTo:searchtxt).orderBy("specilization").startAt([searchtxt,]) .endAt([searchtxt+'\uf8ff',]) .snapshots() :FirebaseFirestore.instance.collection("addjop").snapshots(), builder:(BuildContext context,snapshot) { if (snapshot.connectionState == ConnectionState.waiting && snapshot.hasData != true) { return Center( child:CircularProgressIndicator(), ); } else {retun widget(); } })
dxxyhpgq3#
对于像名字这样的短字符串有一种方法。我们在我们的应用程序中经常使用这种方法。你可以把名字分成几个小部分,然后把它们添加到一个数组中。要用全文搜索来搜索名字,请等待至少有3个字母,然后使用array-contains-any查询来检查字母组合是否是数组的一部分。拆分到数组代码:
array-contains-any
const MAPPING_TABLE = { à: 'a', á: 'a', â: 'a', ã: 'a', å: 'a', æ: 'ae', ç: 'c', è: 'e', é: 'e', ê: 'e', ë: 'e', ì: 'i', í: 'i', î: 'i', ï: 'i', ñ: 'n', ò: 'o', ó: 'o', ô: 'o', õ: 'o', ù: 'u', ú: 'u', û: 'u', ý: 'y', ÿ: 'y', } function splitStringToArray(stringToSplit) { const listCharacters = stringToSplit.split('') var output = [] //replace special Characters for (var i = 0; i < listCharacters.length; i++) { if (MAPPING_TABLE[listCharacters[i]] != null) { listCharacters[i] = MAPPING_TABLE[listCharacters[i]] } } for (var i = 0; i < listCharacters.length; i++) { var temp = [listCharacters[i]] for (var j = i + 1; j < listCharacters.length; j++) { temp.push(listCharacters[j]) const joinedString = temp.join('').toLowerCase() if (joinedString.length > 2) { output.push(joinedString) } } } return output } export default splitStringToArray
下面是一个用于搜索名称的查询:
ref = ref.where("search", "array-contains-any", [value.toLowerCase()]); const snap = await ref.limitToLast(20).get();
我也会把结果限制在一个现实的元素数量。
3条答案
按热度按时间nbnkbykc1#
Firestore没有内置的全文搜索功能。我常用的两个查询操作符是:
isEqualTo:
查找字段与值完全匹配的文档。isGreaterThanOrEqualTo:
和isLessThanOrEqualTo:
(或startAt:
和endAt:
)搜索字段以特定值开头的文档。例如,若要搜索所有
name
以al
开头的文档,可以使用collectionRef.where("name", isGreaterThanOrEqualTo: "al").where("name", isLessThanOrEqualTo: "al\uf7ff")
。这里的\uf7ff
只是最后一个已知的Unicode字符,因此查询在处理完每个al
后就停止返回结果。如果您需要任何其他文本搜索操作,则需要使用其他解决方案--例如记录为here的Algolia。
axzmvihb2#
这段代码在使用firestone flutter搜索文本时非常有帮助
dxxyhpgq3#
对于像名字这样的短字符串有一种方法。我们在我们的应用程序中经常使用这种方法。你可以把名字分成几个小部分,然后把它们添加到一个数组中。要用全文搜索来搜索名字,请等待至少有3个字母,然后使用
array-contains-any
查询来检查字母组合是否是数组的一部分。拆分到数组代码:
下面是一个用于搜索名称的查询:
我也会把结果限制在一个现实的元素数量。