如何为 firebase firestore 创建搜索功能?
How can I create a search function for firebase firestore?
我只找到了有关实时数据库而不是 firestore 的答案,我希望能够让用户搜索名称并取回所有匹配的文档。我正在使用调用文本字段文本的 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
}
}
这就是同一集合中每个文档的建模方式。我只想获取字段“名称”与文本字段搜索文本匹配的文档。
到目前为止我已经试过了:
@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)")
}
}
}
我可以让代码工作的唯一方法是使用 whereField isEqualTo 但这只有在用户准确键入名称然后进行搜索时才有效,这不会在用户搜索时提供实时结果。我怎样才能从我的 firestore 集合中获得搜索结果的实时反馈?
编辑:None 这些问题有实时反馈,他们没有回答我的问题。而且他们中的大多数甚至不在Swift。在关闭此 post 之前,请先将 link 作为评论留下。这个问题的具体要求我还没有找到答案。
Firestore - implementing search fields
How to search text in Flutter using Firestore
经过更多创造性思考后,我决定为每个文档创建关键字。它不是超级优雅,但它确实有效。此外,每个“名称”字段限制为 X 个字符,因此我无需担心关键字字段超过 20-30 个单独的关键字字符串。
我加了
var keywords: [String]?
到 StoryModel 并且字段在创建文档时填写后如下所示:
我正在通过以下方式获得实时结果:
private lazy var storiesDataCollection = Firestore.firestore().collection("Stories")
self.storiesDataCollection
.whereField("keywords", arrayContains: self.storiesSearchText)
.limit(to: 8)
.getDocuments {}
我没有包括创建关键字的功能,因为我还没有完成它,一旦完成我将编辑并添加它,但为了测试我只是在 firestore 中手动创建关键字。最后,这个解决方案不忽略大小写,搜索文本必须完全匹配。
编辑:这是创建关键字的函数,我还添加了使大小写匹配和小写以便更好地搜索的功能。
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")
}
}
}
如果你给它输入一串“Trevor 的新年派对”,它会返回以下内容:
["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"]
请注意,反斜杠实际上并未上传到 firestore。
我只找到了有关实时数据库而不是 firestore 的答案,我希望能够让用户搜索名称并取回所有匹配的文档。我正在使用调用文本字段文本的 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
}
}
这就是同一集合中每个文档的建模方式。我只想获取字段“名称”与文本字段搜索文本匹配的文档。 到目前为止我已经试过了:
@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)")
}
}
}
我可以让代码工作的唯一方法是使用 whereField isEqualTo 但这只有在用户准确键入名称然后进行搜索时才有效,这不会在用户搜索时提供实时结果。我怎样才能从我的 firestore 集合中获得搜索结果的实时反馈?
编辑:None 这些问题有实时反馈,他们没有回答我的问题。而且他们中的大多数甚至不在Swift。在关闭此 post 之前,请先将 link 作为评论留下。这个问题的具体要求我还没有找到答案。
Firestore - implementing search fields
How to search text in Flutter using Firestore
经过更多创造性思考后,我决定为每个文档创建关键字。它不是超级优雅,但它确实有效。此外,每个“名称”字段限制为 X 个字符,因此我无需担心关键字字段超过 20-30 个单独的关键字字符串。
我加了
var keywords: [String]?
到 StoryModel 并且字段在创建文档时填写后如下所示:
我正在通过以下方式获得实时结果:
private lazy var storiesDataCollection = Firestore.firestore().collection("Stories")
self.storiesDataCollection
.whereField("keywords", arrayContains: self.storiesSearchText)
.limit(to: 8)
.getDocuments {}
我没有包括创建关键字的功能,因为我还没有完成它,一旦完成我将编辑并添加它,但为了测试我只是在 firestore 中手动创建关键字。最后,这个解决方案不忽略大小写,搜索文本必须完全匹配。
编辑:这是创建关键字的函数,我还添加了使大小写匹配和小写以便更好地搜索的功能。
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")
}
}
}
如果你给它输入一串“Trevor 的新年派对”,它会返回以下内容:
["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"]
请注意,反斜杠实际上并未上传到 firestore。