[英]Swift, Firebase, Flashlight, how to store arrays?
我目前正在尝试使用Firebase,Flashlight和Swift创建搜索功能以从实时数据库中检索随机对象。
我正在尝试在/ search / request对Firebase执行以下查询
var searchSettings : [Any] = []
if Settings.searchPackage != 99 {
searchSettings.append(["match" : Settings.searchPackage])
}
if Settings.searchCountry != .world {
if let region = Locale.current.regionCode {
searchSettings.append(["match" : region])
}
}
if Settings.searchGender != .All {
searchSettings.append(["match" : Settings.searchGender.rawValue])
}
let postData = [
"index" : "firebase",
"type" : "test",
"body" : [
"query" : searchSettings
]
] as [String : Any]
ref.setValue(postData, withCompletionBlock: { (error, reference) in
if error == nil {
FIRDatabase.database().reference().child("search/response").child(ref.key).observeSingleEvent(of: .childAdded, with: { (snapshot) in
if snapshot.exists() {
print("found random snapshot based on settings \(snapshot)")
}
})
}
})
问题是,如Firebase当前在文档中所述,它确实支持数组,因此“查询”的内容为:
Flashlight将引发错误,因为它希望“查询”包含“匹配”字段,而不包含它们的数组索引。
我该如何解决? 我希望能够基于多个字段进行搜索。
从技术上讲,手电筒根本不关心您在body
标签中放置的内容。 它只是将其传递给ElasticSearch。 因此,如果生成有关格式的错误,则抱怨的是ElasticSearch。
您可能在这里遇到的是:a)ElasticSearch不喜欢该语法,或者Firebase的类似于数组的行为将数组转换为对象。
请注意,Flashlight将允许您传递JSON字符串代替body
。 因此,如果这是类似数组的行为的结果,则可以在将查询传递给ES之前使用JSON.stringify()进行查询,该查询将按预期从另一端输出。
如果问题是ES语法(在我看来是这样),那么您可以直接针对ES运行查询,直到它们起作用为止,然后修改您的客户端以相应地提交正确的语法。
看看这个要点: Swift中的BodyQuery
我在Android应用程序项目中编写了此代码,并使用它来构建ES查询。 这等效于Java for Android, ElasticSearch需要json查询,您可以使用Maps(Android)/ Dictionaries(iOS)轻松创建它。 请享用 :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.