我的愿望是实现按标签搜索功能,该功能在用户继续输入搜索词时返回建议。
我的模型具有以下结构
class BuyerPost{
final String postId;
final String buyer;
final String description;
final GeoPoint locationCoordinates;
final List tags;// search by this
final List imageUrls;
final String category;
final Timestamp postTime;
final Timestamp expireTime;
final int responsesCount;
final String status;
BuyerPost({
this.postId,
this.buyer,
this.description,
this.locationCoordinates,
this.tags,
this.imageUrls,
this.category,
this.postTime,
this.expireTime,
this.responsesCount,
this.status,
});
}
与上面的代码段一样,模型的tags属性是用户设置的标签列表。
到目前为止,仅当搜索词与标签列表中的标签名称完全匹配时,我才执行搜索以返回文档的操作。
示例:
如果用户在帖子中带有诸如tags:['black','white']
之类的标签的情况下搜索“ bl”,则在他/她将其填写为类似于“ black”之前不会返回任何内容。
这是搜索的摘录
//single buyer post
Stream <List<BuyerPost>> get searchBuyerPost {
try {
return buyerPostCollection.snapshots()
.map(yieldSearchedBuyerPosts);
}catch(e){
print(e.toString());
return null;
}
}
List<BuyerPost> yieldSearchedBuyerPosts(QuerySnapshot snapshot) {
try {
return snapshot.documents.map((doc) {
print(doc.data['name']);
return BuyerPost(
postId: doc.data['postId'] ?? '',
description: doc.data['description'] ?? '',
locationCoordinates: doc.data['locationCoordinates'] ?? '',
imageUrls: doc.data['imageUrl'] ?? [],
tags: doc.data['tags'] ?? [],
category: doc.data['category'] ?? '',
postTime: doc.data['postTime']?? Timestamp(0,0),
expireTime: doc.data['expireTime']?? Timestamp(0,0),
responsesCount: doc.data['responsesCount']?? 0,
status: doc.data['status'] ?? '',
);
}).where((post) =>
post.tags.contains(searchTerm.toLowerCase()
)
).toList();
}catch(e){
print(e.toString());
return null;
}
}
我也希望搜索也可以提供建议。我该如何实现?
答案 0 :(得分:0)
如果您想更好地控制字符串匹配,建议您看看 Regex 。
这里是一个例子:
List<BuyerPost> match(String searchString, List<BuyerPost> posts) {
RegExp searchedStringRegex = RegExp(searchString);
return posts.where((post) => post.tags.any((tag) => searchedStringRegex.hasMatch(tag)));
}
此处match
函数将返回包含所搜索字符串的所有标记。