我正在尝试构建一个搜索功能,其中在搜索字段中输入的文本将通过 Firestore 中的两个字段(个人资料名称和用户名)进行搜索。例如,如果用户的个人资料名称为“Sylvester Appiah”,用户名为“keeett”。然后,当搜索用户名或配置文件名称时,它应该返回相同的用户。我不确定是否可以在 .where() 方法中执行 profileName 或 username 操作。如有任何帮助,我们将不胜感激!
controlSearch(String searchWord){
Future<QuerySnapshot>pUsers=usersReference
.where("profileName",isGreaterThanOrEqualTo:searchWord)
.getDocuments();
setState(() {
futureSearchResult = pUsers;
});
}
您无法将多个条件传递给
where()
。相反,您可以多次调用 where()
,将它们链接在一起形成您需要的查询:
usersReference
.where("profileName",isGreaterThanOrEqualTo: searchWord)
.where("username",isEqualTo: "QeustionableCoder")
.getDocuments();
请注意,您可能需要为此类多字段查询定义索引。如果您缺少索引,SDK 将记录有关该索引的错误消息。查找该错误消息中的 URL,因为这是在正确字段上定义索引的最快方法。
我在名称
search keywords
下向每个文档添加了一个新字段作为列表字段,并放置了我想要搜索的字段。
示例:
await FirebaseFirestore.instance.collection('your collection').doc().set({
'name' : 'Faris',
'age' : 25,
'country' : 'Iraq',
'search keywords' : [
'Faris',
25,
'Iraq',
],
});
当我想搜索时,我将使用
search keywords
字段键。
Stream<QuerySnapshot> get searchFilteredData {
return FirebaseFirestore.instance
.collection('your collection')
.where('search keywords', arrayContains: searchFilter)
.snapshots()
.handleError((error) => print(error.toString()));
}
然后,您可以使用
StreamBuilder
来搜索并获取数据。
此方法的缺点之一是您必须键入准确的值才能获取所需的数据,仅写入部分值是不够的。
我从这个YouTube视频
学到了这个方法