当前位置: 首页 > 知识库问答 >
问题:

如何为firebase firestore创建搜索功能?[副本]

齐驰
2023-03-14

原始关闭原因未解决

我只找到了有关实时数据库而不是fiRecovery的答案,我希望能够让用户搜索名称并取回所有匹配的文档。我正在使用一个文本字段来调用文本字段文本的函数onChange(也限制为每2秒调用一次以减少调用量)。

struct StoryModel: Identifiable, Codable, Hashable {
    var id: String
    var isLive: Bool?
    var name: String?
    var description: String?
    
    private enum CodingKeys: String, CodingKey {
        case id
        case isLive
        case name
        case description
    }
}

这就是同一集合中每个文档的建模方式。我只想获取字段“name”与文本字段搜索文本匹配的文档。到目前为止,我已经尝试过:

    @Published var storiesSearchText: String = ""
    @Published var searchedStories: [StoryModel] = []
    private lazy var storiesDataCollection = Firestore.firestore().collection("Stories")
    
    public func getSearchedStories() {
        print(storiesSearchText)
        self.storiesDataCollection
           .whereField("isLive", isEqualTo: true)
           .whereField("name", in: [self.storiesSearchText])
           .getDocuments { (snapshot, error) in
            if let documents = snapshot?.documents {
                for document in documents {
                    print(document)
                    if let story = try? document.data(as: StoryModel.self) {
                        self.searchedStories.append(story)
                    }
                }
            } else if let error = error {
                print("Error getting search stories: \(error)")
            }
        }
    }

我可以让代码工作的唯一方法是使用Anywhere Field isEqualTo,但这只有在用户准确键入名称然后进行搜索时才有效,这不会在用户搜索时提供实时结果。如何从我的火力收藏中实现搜索结果的实时反馈?

编辑:这些问题都没有实时反馈,它们都没有回答我的问题。而且它们中的大多数甚至不在Swift中。请在关闭此帖子之前先将链接作为评论留下。我还没有找到这个问题的具体要求的答案。

如何在Firestore数据库中搜索?

Firest-实现搜索字段

如何使用Firestore在颤振中搜索文本

Google Firestore:查询属性值的子字符串(文本搜索)

共有1个答案

姚棋
2023-03-14

经过一些创造性的思考,我决定为每个文档创建关键字。它不是非常优雅,但很管用。此外,每个“name”字段限制为X个字符,因此我不需要担心关键字字段超过20-30个单独的关键字字符串。

我补充道

var keywords: [String]?

我通过以下方式获得现场结果:

private lazy var storiesDataCollection = Firestore.firestore().collection("Stories")

self.storiesDataCollection
   .whereField("keywords", arrayContains: self.storiesSearchText)
   .limit(to: 8)
   .getDocuments {}

我不包括创建关键字的函数,因为我根本还没有这样做,一旦我完成它,我会编辑和添加它,但为了测试,我只是在fiRecovery中手动创建了关键字。最后,这个解决方案不会忽略大小写,搜索文本必须完全匹配。

编辑:这是创建关键字的函数,我还添加了使大小写匹配和小写的功能,以便更好地搜索。

    func createKeywords(name: String) {
        var keywords: [String] = []
        var lowercaseKeywords: [String] = []
        var alreadyKeyed: String = ""
        for letter in name {
            if keywords.isEmpty {
                keywords.append("\(letter)")
                let lower = letter.lowercased()
                lowercaseKeywords.append("\(lower)")
            } else {
                let key = alreadyKeyed + "\(letter)"
                keywords.append(key)
                let lower = key.lowercased()
                lowercaseKeywords.append("\(lower)")
            }
            alreadyKeyed.append("\(letter)")
        }
        let allKeywords = keywords + lowercaseKeywords
        self.storiesDataCollection.document("doc id goes here").updateData([
            "keywords" : allKeywords
        ]) { error in
            if let error = error {
                print("Error: \(error)")
            } else {
                print("SUCCESS")
            }
        }
    }

如果你要喂它一串“特雷弗的NYE派对”,它会回报给你:

["T", "Tr", "Tre", "Trev", "Trevo", "Trevor", "Trevor\'", "Trevor\'s", "Trevor\'s ", "Trevor\'s N", "Trevor\'s NY", "Trevor\'s NYE", "Trevor\'s NYE ", "Trevor\'s NYE P", "Trevor\'s NYE Pa", "Trevor\'s NYE Par", "Trevor\'s NYE Part", "Trevor\'s NYE Party", "t", "tr", "tre", "trev", "trevo", "trevor", "trevor\'", "trevor\'s", "trevor\'s ", "trevor\'s n", "trevor\'s ny", "trevor\'s nye", "trevor\'s nye ", "trevor\'s nye p", "trevor\'s nye pa", "trevor\'s nye par", "trevor\'s nye part", "trevor\'s nye party"]

请注意,反斜杠实际上并没有上传到firest。

 类似资料:
  • 问题内容: 我想为查询建立索引 如果我有一个像下面这样的表 我想创建一个索引,以便能够高效地执行以下操作: 还有这个: 我也希望该表能够实时更新。 如何创建这样的索引?(我有一种需要索引的感觉,但是我对需要给它提供什么选择感到困惑) 我正在使用Oracle 10g。 问题答案: 我会用这个(将您的最小和最大长度设置为适当值) 这些参数在此处解释《Oracle文本参考》

  • 12.7.1. 布尔全文搜索 12.7.2. 全文搜索带查询扩展 12.7.3. 全文停止字 12.7.4. 全文限定条件 12.7.5. 微调MySQL全文搜索 MATCH (col1,col2,...) AGAINST (expr [IN BOOLEAN MODE | WITH QUERY EXPANSION]) MySQL支持全文索引和搜索功能。MySQL中的全文索引类型FULLTEXT的索

  • 我正在尝试实现一个二叉查找树,但是“搜索”函数对于除了根之外的每个条目都返回了错误的值。 该函数应返回其值与键参数匹配的节点的地址,如果节点不存在,则返回 NULL。 当我运行代码时,我得到以下内容: 我知道每个节点的“左”和“右”指针链接正确,因为“delAll”函数成功删除了所有节点。 将“cout”语句添加到“search”函数表明该函数似乎返回了正确的地址。为什么从主主调用时会打印错误的地

  • 问题内容: 我正在尝试为我的网站创建一个产品搜索,用户可以在其中搜索多种语言的产品,如果没有完全匹配的内容,则(希望)获得模糊的搜索结果。 我有一个带有列的表。 该列指的是其各自表中产品的ID。 这些列具有各种语言的每种产品的翻译后的meta。 元只是由空格分隔的关键字 是搜索词。 指用户选择的语言 因此,首先,我执行一个基本的“ LIKE” SQL查询以查看是否存在匹配项,如果没有结果,则查询所

  • 但这会产生以下错误: 更新 我试图创建一个类,实现,它基本上试图将对象表示为,其中对象可以是任何类型。当前正在使用和操作和方法中的字段,并使用上述方法创建和对象以调用getter和setter方法。我想知道是否可以将这两个单独的方法合并为一个。 可用作到的示例类: 下面是预期的用法:

  • 主要内容:numpy.sort(),numpy.argsort(),numpy.lexsort(),numpy.nonzero(),numpy.where(),numpy.extract(),numpy.argmax(),numpy.argmin()NumPy 提供了多种排序函数, 这些排序函数可以实现不同的排序算法。 排序算法特征主要体现在以下四个方面:执行速度,最坏情况下的复杂度,所需的工作空间以及算法的稳定性。下表列举了三种排序算法: NumPy排序算法 种类 速度 最坏复杂度 工作空间