我目前正在尝试使用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目前支持数组,因此"查询"将是:
手电筒会抛出一个错误,因为它需要"查询"包含"匹配"字段而不是它们数组的索引。
我该如何解决这个问题?我希望能够根据多个字段进行搜索。
答案 0 :(得分:0)
从技术上讲,手电筒并不关心你放在body
标签内的所有内容;它只是将其传递给ElasticSearch。因此,如果生成有关格式的错误,那就是正在进行抱怨的ElasticSearch。
你可能遇到的是a)ElasticSearch不喜欢这种语法,或者Firebase的array-like behaviors正在将数组转换为对象。
请注意,Flashlight将允许您传递JSON字符串来代替body
。因此,如果这是类似数组的行为的结果,您可以在将查询传递给ES之前对其进行JSON.stringify(),并且它将按照预期从另一端出来。
如果问题是ES语法(在我看来),那么您可以直接针对ES运行查询,直到它们工作,然后修改您的客户端以相应地提交正确的语法。
答案 1 :(得分:0)
看看这个要点: BodyQuery in Swift
我在我的Android应用程序项目中写了这个,我用这个来构建ES的查询。 Here is equivalent in Java for Android ElasticSearch需要json查询,您可以使用Maps(Android)/ Dictionaries(iOS)轻松创建它。享受:)