扑扑地实现搜索建议

时间:2020-10-02 14:17:32

标签: flutter search tags

我的愿望是实现按标签搜索功能,该功能在用户继续输入搜索词时返回建议。

我的模型具有以下结构

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;
    }
  }

我也希望搜索也可以提供建议。我该如何实现?

1 个答案:

答案 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函数将返回包含所搜索字符串的所有标记。